关于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,通过它来设置弹出子窗口的位置:

 1  public static class ChildWindowExtensions
 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 = new ChildWindow1();
ch.SetStartLocation(100, 100);
            ch.Show();

但是,运行后,当你点击Button的时候,会抛出一个异常,这是因为,此时ChildWindow还没有产生在可视化树上,所以你必须在它完成布局初始化,并产生在可视化树上的时候

才能,通过VisualTreeHelper找到需要的属性,我们修改代码如下:

 1  private void button1_Click(object sender, RoutedEventArgs e)
 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不仅仅只是用来查看可视化树结构的相关推荐

  1. tensorboard拒绝连接的解决方法总结(如何使用tensorboard查看可视化图像总结)

    当使用tensorflow保存了tensorboard的相关信息后(tensorflow如何使用tensorboard可视化工具库可以参考我的上一篇文章:https://blog.csdn.net/d ...

  2. maven 查看依赖树结构

    maven 查看依赖树结构 maven 查看依赖树结构 maven 查看依赖树结构 1.使用maven 管理项目的依赖,可以使用如下命令查看依赖树结构: mvn dependency:tree 2.如 ...

  3. 使用logdashboard查看可视化日志

    logdashboard 日志面板是我在Github写的一个开源项目,旨在让查看日志变的方便快捷.在线预览 现在功能有日志检索.趋势图.异常堆栈快速查看.日志详情等 logdashboard支持自定义 ...

  4. 分享Silverlight/WPF/Windows Phone一周学习导读(3月1日-3月5日)

    休假一个月,没有更新Silverlight/WPF/Windows Phone学习导读.从本周开始继续分享每周最新的Silverlight/WPF/Windows Phone开发学习导读. 本周Sil ...

  5. 安卓学习专栏——查看安卓数据库,用navicat premium与sqlitestudio可视化查看数据库(图文保姆级)

    步骤 系列文章 前言 1.找到数据库文件 1.1打开Device File Explerer 文件查找工具 1.2找到数据库资源路径 1.3保存在文件夹 2.navicat premium可视化 2. ...

  6. 音乐雷达 shazam算法_具有10亿首Shazam音乐识别功能的数据可视化

    音乐雷达 shazam算法 While at university, I joined Shazam as part time web developer. I stayed at Shazam fo ...

  7. VisualTreeHelper

    Silverlight中只有可视化树,没有WPF中的逻辑树,这一点可从SL的sdk文档中得到印证: 可视化树概念也存在于 WPF 中,它与 Silverlight 的可视化树概念类似.然而,一个显著的 ...

  8. WPF 可视化树和逻辑树

    自开始接触WPF开始一直对可视化树和逻辑树没有清晰地认识和区别,下面进行一次总结.学海无涯,开始吧!!! 背景 目前SDK文档中关于视觉树和逻辑树的介绍还不是很完全. 事实证明WPF中的元素树相当复杂 ...

  9. WPF-10 逻辑树和可视化树

    我们在WPF-03 资源之Resources结尾中介绍逻辑树和可视化树的基本概念,我们这节来介绍这两棵树 逻辑树(Logical Tree) 逻辑树是由每个控件的节点组成,本质上就是XAML文件中的U ...

  10. 1个数据可视化的「百搭套路」,从此打开新思路

    引言 针对不同的数据类型和数据任务,我们应该如何选择合适的数据可视化? 本文整理了数据可视化的经典套路,希望对你有所启发. 数据分类 首先,我们对数据类型进行分析. 基于任务分类学的数据类型(Data ...

最新文章

  1. 8位alu运算器(vhdl语言)_C语言中signed char类型,能表示-128到127,为什么负数多一位?...
  2. 物联网安全的后备计划是什么?
  3. python官网支持货到付款吗_官网购买的iPhone12pro还没发货?试着用Python快速入手...
  4. ERROR: tensorboard 1.14.0 has requirement setuptools=41.0.0, but you'll have setuptools 39.1.0 whic
  5. 揭秘《死者之书》之环境资源及特效创作
  6. Xamarin简介与Xamarin支持MVC设计模式
  7. uploadify的使用错误
  8. textview文本超出部分用省略号表示
  9. 使用Java 8在地图上流式传输
  10. WPF使用Canvas绘制可变矩形
  11. java拓展接口_Java拓展接口-default关键词
  12. Ubuntu更改右键菜单
  13. python class 2
  14. VMware 中的操作系统切换模式后总是连接不上互联网可能的问题之一
  15. onenote怎么同步到电脑_如何同步手机和电脑 onenote
  16. Halcon create_pose算子帮助文档翻译
  17. 2014年红帽高峰论坛随笔
  18. 如何淡化疤痕留下的黑色色素
  19. 申论公文题-总结类-1
  20. 二代身份证号码最后一位校验位的计算方法

热门文章

  1. struts1:Struts的中央控制器
  2. Mysql 的 GROUP_CONCAT() 函数拼接串
  3. HENXU-SOA的业务规划和建模方法之八——组件化业务模型(CBM)介绍
  4. Shiro(三)——Shiro授权入门案例
  5. Luogu4198 楼房重建
  6. HDU1847 Good Luck in CET-4 Everybody!
  7. 负载均衡的几种方式_负载均衡的几种类型
  8. python架构师是做什么的_架构师的工作都干些什么?!想做架构师必看!
  9. es6 对象中是否有键值_JS获取对象键值对中key值的方法
  10. springboot自动装配原理(通俗易懂)