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 ...
随机推荐
- FTP弱口令猜解【python脚本】
ftp弱口令猜解 python脚本: #! /usr/bin/env python # _*_ coding:utf-8 _*_ import ftplib,time username_list=[' ...
- poj1852 Ants ——想法题、水题
求最短时间和最长时间. 当两个蚂蚁相遇的时候,可以看做两个蚂蚁穿过,对结果没有影响.O(N)的复杂度 c++版: #include <cstdio> #define min(a, b) ( ...
- 关于as3调用js报“null为空或不是对象”错误
主要原因是:flash插件的object对象无ID属性. 顺便说下as3调用js的方法. as3引用: import flash.external.ExternalInterface; as3中调用 ...
- QT常用资料
QTableView介绍 Qt 自定义 滚动条 样式 QTableWidget控件总结 QTableWidget的使用和美工总结 QT__stylesheet__操作 QSS QT皮肤(QSS)编程 ...
- [java]wordcount程序
词数统计系统. 作业解析:这次作业的内容是从本地读取一个程序代码,计算出这个程序中的行数,单词数,也可进行拓展. 实现语言:java 编程思路: 程序是由各种单词和符号组成的,单词包括关键字,标识符这 ...
- UIView详解
MVC架构模式 MVC(Model-View-Controller)是实现数据和显示数据的视图分离的架构模式(有一定规模的应用都应该实现数据和显示的分离).其中,M代表模型,就是程序中使用的数据和 ...
- SQL 行转列和列转行
SQL 行转列和列转行 行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过 ...
- 远程调试js注意事项
1:使用host切换工具,先注释掉93服务器的地址,打开链接,点击高级选项,进去后登陆账号密码(如果不行重启浏览器): 2:进入后,增加93服务器上的host地址,重启浏览器,css样式生效: 3:使 ...
- 简单配置和使用Maven
1,下载Maven 从:https://maven.apache.org/download.cgi 其实两个都一样, 2,安装过程 解压你下载的包,随意放哪里都可以 ,假设 我放在了 D:\JavaT ...
- JAVA访问权限
同一个类 同一个包 不同包的子类 不同包的非子类 Private √ Default √ √ Protected √ √ √ Public √ √ √ √