当需要动态添加、修改、删除控件时,如果要达到最好的效果,肯定不只是把需要的控件添加到容器中,并且还需要把容器中的已有控件进行排序操作(置顶、置底、前移、后移操作)。由于初次接触到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. 苹果Xcode 证书生成、设置、应用完整图文教程

    Xcode 证书生成.设置.应用,与大家分享. 为了能够在iPhone或iPod Touch上运行iPhone应用程序,必须使用有效的数字证书签名.这个证书用于将您的开发者身份与在注册期间所提供的已确 ...

  2. poj1298 The Hardest Problem Ever 简单题

    链接:http://poj.org/problem?id=1298&lang=default&change=true 简单的入门题目也有这么强悍的技巧啊!! 书上面的代码: 很厉害有没 ...

  3. php日历

    一.计算数据 1.new一个Calendar类 2.初始化两个下拉框中的数据,年份与月份 3.初始化要搜索的年份和月份 4.计算得出日历中每一天的数据信息,包括css.天数 <?php requ ...

  4. jekins构建自动化项目的步骤

    填入项目名字 源码管理从git自动拉取代码到工作目录 jenkins拉取代码会到工作空间linux下安装完目录是/var/lib/jenkins/workspace/jeekins-test(可以根据 ...

  5. CE 进程间通信

    WINCE下进程间通信常用的方式有:剪贴板(Clipboard),网络套接字(Socket),WM_COPYDATA消息,共享内存,管道(消息队列),注册表等 剪贴板 //////////////// ...

  6. 数据库中Schema和Database有什么区别

    在MySQL中创建一个Schema好像就跟创建一个Database是一样的效果,在SQL Server和Orcal数据库中好像又不一样. 目前我只能理解,在mysql中 schema<==> ...

  7. Java--super关键字用法

    看了马老师的视频,百度了一下,随即敲了一些代码,super是超人,超级的意思,层面上理解为父类 class Person { Person(){             System.out.prin ...

  8. 1.AutoMapper核心:扁平化

    对象 - 对象映射的一个常见用法是获取一个复杂的对象模型,并将其展开成一个更简单的模型. 您可以采取复杂的模型,如: public class Order { private readonly ILi ...

  9. python 模块库

    python mod --------------------os              https://segmentfault.com/a/1190000003061079logging    ...

  10. FlashBuilder 新建项目时提示 java.lang.nullpointerexception

    可以尝试安装 Air SDK