VisualTreeHelper不仅仅只是用来查看可视化树结构的
关于VisualTreeHelper这个类,大家应该都应该看到过,它是silverlight提供的一个帮助器类,通过它,以便您可以检查可视化树结构。今天,我们来通过对VisualTreeHelper的使用,来做一些比较有意思的事情,当然不止是查看可视化树的结构,是不是有点迫不及待了呢?其实,也没什么特别离谱,当然还是和可视化树有关啦。其实呢,今天,我们要使用VisualTreeHelper来通过对可视化树结构的遍历,“潜入”到控件的Template中去,通过对Template中元素的访问,来改变控件的一些不直接暴露在外的属性。
我不想ChildWindow每次都从屏幕中间弹出
最近,在做与ChildWindow相关的项目时,发现每次在调用它显示的时候,它都从屏幕中间弹出,但是有时候,我们需要它从特定的位置弹出,查看了下文档,发现并没有现成的可以控制它的属性,那是否就无法来设置它的位置了呢?这时,该是VisualTreeHelper登场的时候了,不过在这之前,我们得先来看一个东西,所有的奥秘也在这个东西里面,那就是ChildWindow的Template。我们都知道,silverlight的控件都是在内部实现了它的基本模板(Template)和样式(Style)。
那么,我们接下来就来看看ChildWindow的Template中到底有什么东西。要想看它,有两个办法,一个是查看官方文档,里面有关于它的定义,还有一个方法就是通过Blend这个“神器”。在这里,我选择了第二个方法,我们打开Blend,然后定位到ChildWindow鼠标右击,选择编辑模板--编辑副本,确定之后,我们就能看到如下结果:
我们注意到,里面有一个Grid叫做ContentRoot,这并不是重点,其实,亮点在它的下面,看到了吧,在RenderTransform下有一组Transform,没错,找到了,奥秘就在这里,我们要想控制ChildWindow的位置,只要设置其中的TranslateTransform就行了,而要获取它,则是今天的主角VisualTreeHelper要做的事情了。接下来,我们就为ChildWindow写一个扩展方法SetStartLocation,通过它来设置弹出子窗口的位置:
2 {
3
4 public static void SetStartLocation(this ChildWindow childWindow, double x, double y)
5 {
6
7 var template = VisualTreeHelper.GetChild(childWindow, 0) as FrameworkElement;
8
9 var contentRoot = template.FindName("ContentRoot") as FrameworkElement;
10
11 var group = contentRoot.RenderTransform as TransformGroup;
12
13 TranslateTransform translateTransform = null;
14
15 foreach (var transform in group.Children.OfType<TranslateTransform>())
16 {
17
18 translateTransform = transform;
19
20 }
21
22 // 设置初始位置
23
24 translateTransform.X = x;
25
26 translateTransform.Y = y;
27
28 }
29
30
31
32
33
34 }
上面的代码通过VisualTreeHelper来得到可视化树的结构,然后进一步找到模板中我们需要的属性,最后设置它就行了,于是,我们就能在实际中使用它了,我们在主页面中添加
一个Button,并添加Click事件,在Click事件中生成ChildWindow对象并设置它的初始位置,最后show这个窗体:
ch.SetStartLocation(100, 100);
ch.Show();
但是,运行后,当你点击Button的时候,会抛出一个异常,这是因为,此时ChildWindow还没有产生在可视化树上,所以你必须在它完成布局初始化,并产生在可视化树上的时候
才能,通过VisualTreeHelper找到需要的属性,我们修改代码如下:
2 {
3 ch = new ChildWindow1();
4 ch.Show();
5 ch.Loaded += new RoutedEventHandler(ch_Loaded);
6
7
8 }
9
10 void ch_Loaded(object sender, RoutedEventArgs e)
11 {
12 ch.SetStartLocation(100, 100);
13 }
14
这样,当你再点击Button的时候,子窗体将会在你设定的位置弹出,而不是在中心弹出。:)
转载于:https://www.cnblogs.com/vimsk/archive/2011/03/04/1971206.html
VisualTreeHelper不仅仅只是用来查看可视化树结构的相关推荐
- tensorboard拒绝连接的解决方法总结(如何使用tensorboard查看可视化图像总结)
当使用tensorflow保存了tensorboard的相关信息后(tensorflow如何使用tensorboard可视化工具库可以参考我的上一篇文章:https://blog.csdn.net/d ...
- maven 查看依赖树结构
maven 查看依赖树结构 maven 查看依赖树结构 maven 查看依赖树结构 1.使用maven 管理项目的依赖,可以使用如下命令查看依赖树结构: mvn dependency:tree 2.如 ...
- 使用logdashboard查看可视化日志
logdashboard 日志面板是我在Github写的一个开源项目,旨在让查看日志变的方便快捷.在线预览 现在功能有日志检索.趋势图.异常堆栈快速查看.日志详情等 logdashboard支持自定义 ...
- 分享Silverlight/WPF/Windows Phone一周学习导读(3月1日-3月5日)
休假一个月,没有更新Silverlight/WPF/Windows Phone学习导读.从本周开始继续分享每周最新的Silverlight/WPF/Windows Phone开发学习导读. 本周Sil ...
- 安卓学习专栏——查看安卓数据库,用navicat premium与sqlitestudio可视化查看数据库(图文保姆级)
步骤 系列文章 前言 1.找到数据库文件 1.1打开Device File Explerer 文件查找工具 1.2找到数据库资源路径 1.3保存在文件夹 2.navicat premium可视化 2. ...
- 音乐雷达 shazam算法_具有10亿首Shazam音乐识别功能的数据可视化
音乐雷达 shazam算法 While at university, I joined Shazam as part time web developer. I stayed at Shazam fo ...
- VisualTreeHelper
Silverlight中只有可视化树,没有WPF中的逻辑树,这一点可从SL的sdk文档中得到印证: 可视化树概念也存在于 WPF 中,它与 Silverlight 的可视化树概念类似.然而,一个显著的 ...
- WPF 可视化树和逻辑树
自开始接触WPF开始一直对可视化树和逻辑树没有清晰地认识和区别,下面进行一次总结.学海无涯,开始吧!!! 背景 目前SDK文档中关于视觉树和逻辑树的介绍还不是很完全. 事实证明WPF中的元素树相当复杂 ...
- WPF-10 逻辑树和可视化树
我们在WPF-03 资源之Resources结尾中介绍逻辑树和可视化树的基本概念,我们这节来介绍这两棵树 逻辑树(Logical Tree) 逻辑树是由每个控件的节点组成,本质上就是XAML文件中的U ...
- 1个数据可视化的「百搭套路」,从此打开新思路
引言 针对不同的数据类型和数据任务,我们应该如何选择合适的数据可视化? 本文整理了数据可视化的经典套路,希望对你有所启发. 数据分类 首先,我们对数据类型进行分析. 基于任务分类学的数据类型(Data ...
最新文章
- 8位alu运算器(vhdl语言)_C语言中signed char类型,能表示-128到127,为什么负数多一位?...
- 物联网安全的后备计划是什么?
- python官网支持货到付款吗_官网购买的iPhone12pro还没发货?试着用Python快速入手...
- ERROR: tensorboard 1.14.0 has requirement setuptools=41.0.0, but you'll have setuptools 39.1.0 whic
- 揭秘《死者之书》之环境资源及特效创作
- Xamarin简介与Xamarin支持MVC设计模式
- uploadify的使用错误
- textview文本超出部分用省略号表示
- 使用Java 8在地图上流式传输
- WPF使用Canvas绘制可变矩形
- java拓展接口_Java拓展接口-default关键词
- Ubuntu更改右键菜单
- python class 2
- VMware 中的操作系统切换模式后总是连接不上互联网可能的问题之一
- onenote怎么同步到电脑_如何同步手机和电脑 onenote
- Halcon create_pose算子帮助文档翻译
- 2014年红帽高峰论坛随笔
- 如何淡化疤痕留下的黑色色素
- 申论公文题-总结类-1
- 二代身份证号码最后一位校验位的计算方法
热门文章
- struts1:Struts的中央控制器
- Mysql 的 GROUP_CONCAT() 函数拼接串
- HENXU-SOA的业务规划和建模方法之八——组件化业务模型(CBM)介绍
- Shiro(三)——Shiro授权入门案例
- Luogu4198 楼房重建
- HDU1847 Good Luck in CET-4 Everybody!
- 负载均衡的几种方式_负载均衡的几种类型
- python架构师是做什么的_架构师的工作都干些什么?!想做架构师必看!
- es6 对象中是否有键值_JS获取对象键值对中key值的方法
- springboot自动装配原理(通俗易懂)