WPF 容器的Z顺序操作
当需要动态添加、修改、删除控件时,如果要达到最好的效果,肯定不只是把需要的控件添加到容器中,并且还需要把容器中的已有控件进行排序操作(置顶、置底、前移、后移操作)。由于初次接触到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顺序操作的更多相关文章
- Fiddler 插件开发,使用 WPF 作为 UI 控件
Fiddler 插件的 UI,本身使用的 WinForm,这个例子是使用 WinForm 中的 WPF 容器,将 WPF 控件作为 Fiddler 插件的 UI 使用. 为什么使用 WPF ?为了自适 ...
- WPF布局原则
WPF系统使用基于流布局的布局标准,开发人员创建与显示分辨率和窗口大小无关的用户界面.在不同显示器上可以进行很好的缩放. 首先来谈一谈布局原则: WPF窗口只能包含一个元素(Window元素属于内容控 ...
- 使用DotNetBar制作漂亮的WinFrom界面,自定义AgileEAS.NET SOA平台WinClient主界面
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 【转】PV3D的小练习~太阳系八大行星
转自:http://hi.baidu.com/boycy/item/70d1ba53bc8c3a958c12eddf http://www.cnblogs.com/flash3d/archive/20 ...
- Vulkan Tutorial 28 Depth buffering
操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 到目前为止,我们所使用的几何图形为3D,但仍然完全扁平的. ...
- L2-020. 功夫传人*
L2-020. 功夫传人 参考博客 #include<vector> #include<cstring> #include<algorithm> using nam ...
- LeetCode——Binary Search Tree Iterator
Description: Implement an iterator over a binary search tree (BST). Your iterator will be initialize ...
- Javascript笔记部分
写入HTML输出 document.write(“<h1>”); 改变HTML内容 x = document.getElementById(“demo”) //查找元素 后面可以.valu ...
- 【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 ...
随机推荐
- 面试题---PHP
1.PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言. 2.echo,print和print_r的区别: echo和print都可以做 ...
- Maven安装使用
环境:Ubuntu 12.04LTS,jdk1.6 1.下载maven3.05: 2.解压并获取M2/bin/mvn地址: 3.创建~/.mavenrc文件,并加入JAVA_HOME并export(需 ...
- vs2010配置boost编程环境(照抄并简化)
第一步:下载boost,我下载的方法是从http://www.boost.org/上找最新的下载.名字叫boost_1_50_0.7z. 第二步:在D盘(我C盘空间不大,准备出至少10G的空间吧)创建 ...
- java读取properties文件工具
public class PropertiesUtil { public static String get(String filePath, String key) { String val = n ...
- paramiko 登录linux主机后执行tail后返回数据不完整解决方法。
def get_sql_log(host,port,user,password,key_words,out_put_filename): commond='cd crm-app/;./tailall. ...
- 启动struts2项目出现classnotfound错误
由于工作需求.需要了解struts2项目,前几天部署了一个struts2的demo,研究url的解析过程,昨天还是好好的,今天修改了一下web.xml文件,然后启动Tomcat就报错,错误如下: 严重 ...
- 新手之自动转存DLL——20150626星期五
-------------------菜鸟错例一:--------------------------------------------- int a=0; if() { int a = GetTy ...
- CSS中的class与id区别及用法
转自http://www.divcss5.com/rumen/r3.shtml及http://www.jb51.net/css/35927.html 我们平常在用DIV CSS制作Xhtml网页页面时 ...
- requests 快速入门
requests的请求方式 import requests # 发送请求 r = requests.get('https://github.com/timeline.json') r = reque ...
- es6 代码片段理解
代码片段理解: [INCREMENT]: (state, action) => { const { payload: { id } } = action //because payload co ...