当需要动态添加、修改、删除控件时,如果要达到最好的效果,肯定不只是把需要的控件添加到容器中,并且还需要把容器中的已有控件进行排序操作(置顶、置底、前移、后移操作)。由于初次接触到wpf,所以对很多知识都不熟悉,现自己动手实现了一个Zindex的操作算法。

      /// <summary>
/// 操作控件的Z顺序
/// </summary>
/// <param name="sender">菜单</param>
/// <param name="moveToFront">True 前移 ,false 置后</param>
/// <param name="toBottom">true 移动至底端,false 移动一层</param>
private void doMoveZindex(object sender, bool moveToFront, bool toBottom)
{
UIElement ui = ContextMenuService.GetPlacementTarget(LogicalTreeHelper.GetParent(sender as MenuItem));
if (ui is FrameworkElement)
{
FrameworkElement fui = ui as FrameworkElement;
if (fui == null) return; int nowZIndex = Canvas.GetZIndex(fui); //deviceOperator.DeviceCollection保存的就是每个控件对应设备的位置和z顺序值
//取得最大z顺序
int maxZindex = deviceOperator.DeviceCollection
.Select(t => t.ZIndex1)
.Max();
//需要转换的zindex
int nextZindex = -;
if (moveToFront) //前移
{
//如果已经位于最顶层,则取消
if (nowZIndex == maxZindex) return;
if (toBottom) //移动到最顶层
{
nextZindex = maxZindex;
foreach (FrameworkElement childElement in parentCanvas.Children)
{
int zi = Canvas.GetZIndex(childElement); if (zi > nowZIndex)
{
Canvas.SetZIndex(childElement, zi - );
updateDevice(childElement);
maxZindex = -;
}
}
}
else//上移一层
{
nextZindex = nowZIndex + ;
foreach (FrameworkElement childElement in parentCanvas.Children)
{
if (Canvas.GetZIndex(childElement) == nextZindex)
{
Canvas.SetZIndex(childElement, nowZIndex);
updateDevice(childElement);
maxZindex = -;
break;
}
} }
if (maxZindex == -)
{
Canvas.SetZIndex(fui, nextZindex); updateDevice(fui);
}
}
else //置底
{
if (nowZIndex == ) return;
if (toBottom)
{
nextZindex = ;
foreach (FrameworkElement childElement in parentCanvas.Children)
{
int zi = Canvas.GetZIndex(childElement);
if (zi < nowZIndex)
{
Canvas.SetZIndex(childElement, zi + );
updateDevice(childElement);//保存控件的Z顺序值到deviceoperator.DeviceCollection
maxZindex = -;
}
}
}
else
{
nextZindex = nowZIndex - ;
foreach (FrameworkElement childElement in parentCanvas.Children)
{
if (Canvas.GetZIndex(childElement) == nextZindex)
{
Canvas.SetZIndex(childElement, nowZIndex);
updateDevice(childElement);
maxZindex = -;
break;
}
}
}
if (maxZindex == -)
{
Canvas.SetZIndex(fui, nextZindex);
updateDevice(fui);
}
}
}
}
//调用方法
//前移
doMoveZindex(sender, true, false);
//置项
doMoveZindex(sender, true, true);
//后移
doMoveZindex(sender, false, false);
//置底
doMoveZindex(sender, false, true);

这样的一个前提条件是容器中的每一个控件的ZIndex值都不会相同。

待解决的问题:现在变化的z顺序,是针对整个容器来说的。如果可以针对控件的重叠区域,进行修改Z顺序,那么速度应该会得到相应的提升。

WPF 容器的Z顺序操作的更多相关文章

  1. Fiddler 插件开发,使用 WPF 作为 UI 控件

    Fiddler 插件的 UI,本身使用的 WinForm,这个例子是使用 WinForm 中的 WPF 容器,将 WPF 控件作为 Fiddler 插件的 UI 使用. 为什么使用 WPF ?为了自适 ...

  2. WPF布局原则

    WPF系统使用基于流布局的布局标准,开发人员创建与显示分辨率和窗口大小无关的用户界面.在不同显示器上可以进行很好的缩放. 首先来谈一谈布局原则: WPF窗口只能包含一个元素(Window元素属于内容控 ...

  3. 使用DotNetBar制作漂亮的WinFrom界面,自定义AgileEAS.NET SOA平台WinClient主界面

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  4. 【转】PV3D的小练习~太阳系八大行星

    转自:http://hi.baidu.com/boycy/item/70d1ba53bc8c3a958c12eddf http://www.cnblogs.com/flash3d/archive/20 ...

  5. Vulkan Tutorial 28 Depth buffering

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 到目前为止,我们所使用的几何图形为3D,但仍然完全扁平的. ...

  6. L2-020. 功夫传人*

    L2-020. 功夫传人 参考博客 #include<vector> #include<cstring> #include<algorithm> using nam ...

  7. LeetCode——Binary Search Tree Iterator

    Description: Implement an iterator over a binary search tree (BST). Your iterator will be initialize ...

  8. Javascript笔记部分

    写入HTML输出 document.write(“<h1>”); 改变HTML内容 x = document.getElementById(“demo”) //查找元素 后面可以.valu ...

  9. 【Python】使用torrentParser1.03对多文件torrent的分析结果

    Your environment has been set up for using Node.js 8.5.0 (x64) and npm. C:\Users\horn1>cd C:\User ...

随机推荐

  1. FTP弱口令猜解【python脚本】

    ftp弱口令猜解 python脚本: #! /usr/bin/env python # _*_ coding:utf-8 _*_ import ftplib,time username_list=[' ...

  2. poj1852 Ants ——想法题、水题

    求最短时间和最长时间. 当两个蚂蚁相遇的时候,可以看做两个蚂蚁穿过,对结果没有影响.O(N)的复杂度 c++版: #include <cstdio> #define min(a, b) ( ...

  3. 关于as3调用js报“null为空或不是对象”错误

    主要原因是:flash插件的object对象无ID属性. 顺便说下as3调用js的方法. as3引用: import flash.external.ExternalInterface; as3中调用 ...

  4. QT常用资料

    QTableView介绍 Qt 自定义 滚动条 样式 QTableWidget控件总结  QTableWidget的使用和美工总结 QT__stylesheet__操作 QSS QT皮肤(QSS)编程 ...

  5. [java]wordcount程序

    词数统计系统. 作业解析:这次作业的内容是从本地读取一个程序代码,计算出这个程序中的行数,单词数,也可进行拓展. 实现语言:java 编程思路: 程序是由各种单词和符号组成的,单词包括关键字,标识符这 ...

  6. UIView详解

    MVC架构模式   MVC(Model-View-Controller)是实现数据和显示数据的视图分离的架构模式(有一定规模的应用都应该实现数据和显示的分离).其中,M代表模型,就是程序中使用的数据和 ...

  7. SQL 行转列和列转行

    SQL 行转列和列转行 行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过 ...

  8. 远程调试js注意事项

    1:使用host切换工具,先注释掉93服务器的地址,打开链接,点击高级选项,进去后登陆账号密码(如果不行重启浏览器): 2:进入后,增加93服务器上的host地址,重启浏览器,css样式生效: 3:使 ...

  9. 简单配置和使用Maven

    1,下载Maven 从:https://maven.apache.org/download.cgi 其实两个都一样, 2,安装过程 解压你下载的包,随意放哪里都可以 ,假设 我放在了 D:\JavaT ...

  10. JAVA访问权限

      同一个类 同一个包 不同包的子类 不同包的非子类 Private √       Default √ √     Protected √ √ √   Public √ √ √ √