我的编程空间,编程开发者的网络收藏夹
学习永远不晚

WPF在VisualTree上怎么增加Visual

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

WPF在VisualTree上怎么增加Visual

本篇内容主要讲解“WPF在VisualTree上怎么增加Visual”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“WPF在VisualTree上怎么增加Visual”吧!

代码:

    class MyElement : FrameworkElement    {        private Button _button = new Button() { Content = "I'm a Button!"};                public MyElement()        {            this.AssembleVisualChildren();        }        private void AssembleVisualChildren()        {            this.AddVisualChild(this._button);        }        protected override int VisualChildrenCount        {            get            {                return 1;            }        }        protected override Visual GetVisualChild(int index)        {                        return this._button ;        }     }

然后将这个MyElement加入测试窗口,代码如下:

<Window     x:Class="AddVisualChildTest.Window1"    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    xmlns:loc="clr-namespace:AddVisualChildTest"    WindowStartupLocation="CenterScreen"    Title="Window1" Height="300" Width="300">    <Grid>        <loc:MyElement Margin="10"/>    </Grid></Window>

运行后的结果如下:

WPF在VisualTree上怎么增加Visual

空空如也!嗯,被忽悠了。一阵失落、打击之后,我的好奇心被激发了:这是为什么呢?于是我狂找资料,终于被我发现了:

实际上,在上面这个例子中,AddVisualChild这个方法只是在MyElement和Button之间建立起了一种VisualTree上的父子关系,但是并没有将Button挂接到MyElement的VisualTree上,所以最终我们没有在屏幕上看到这个Button。

为了将Button真正挂接到MyElement的VisualTree上,还需要额外做一件事情:在VisualTree上为这个Button分配空间并且指定位置,这个过程叫做Layout。此过程分两个部分:一个是Measure,另一个是Arrange。这两个过程在FrameworkElement上对应着两个方法:MeasureOverride和ArrangeOverride方法。具体做法如下:

        protected override Size MeasureOverride(Size availableSize)        {            if (this.VisualChildrenCount > 0)            {                UIElement child = this.GetVisualChild(0) as UIElement;                Debug.Assert(child != null); // !Assert                child.Measure(availableSize);                return child.DesiredSize;            }            return availableSize;        }        protected override Size ArrangeOverride(Size finalSize)        {            Rect arrangeRect = new Rect()            {                Width = finalSize.Width,                Height = finalSize.Height            };            if (this.VisualChildrenCount > 0)            {                UIElement child = this.GetVisualChild(0) as UIElement;                Debug.Assert(child != null); // !Assert                child.Arrange(arrangeRect);            }            return finalSize;        }

再次运行程序:

WPF在VisualTree上怎么增加Visual

目标实现。

由此,我们可以总结出这个问题的解决方案如下:

  • 在MyElement的构造器中调用AddVisualChild方法;

  • 重写VisualChildCount属性;

  • 重写GetVisualChild方法;

  • 重写MeasureOverride方法;

  • 重写ArrangeOverride方法; 

另外,WPF在此问题的解决上也为开发者提供了一些必要的帮助。就我所知的,有如下几个内容:

1、Panel

还是本文开始提到的问题,只不过要将其中的FrameworkElement换为Panel。除了上面所提到的方法,Panel为我们提供了更加方便的实现方式。代码如下:

    class MyElement : Panel    {        private Button _button = new Button() { Content = "I'm a Button!" };        public MyElement()        {            this.Children.Add(_button);        }        protected override Size MeasureOverride(Size availableSize)        {            if (this.VisualChildrenCount > 0)            {                UIElement child = this.GetVisualChild(0) as UIElement;                Debug.Assert(child != null); // !Assert                child.Measure(availableSize);                return child.DesiredSize;            }            return availableSize;        }        protected override Size ArrangeOverride(Size finalSize)        {            Rect arrangeRect = new Rect()            {                Width = finalSize.Width,                Height = finalSize.Height            };            if (this.VisualChildrenCount > 0)            {                UIElement child = this.GetVisualChild(0) as UIElement;                Debug.Assert(child != null); // !Assert                child.Arrange(arrangeRect);            }            return finalSize;        }    }

之所以能这样做的原因是Panel已经替我们将如下几个工作封装在了UIElementCollection(Panel的Children属性)中:

  • AddVisualChild

  • VisualChildCount

  • GetVisualChild

2、VisualCollection

另外,在这个过程中,我们还可以使用一个叫做VisualCollection的类来作为所有 Visual Child的容器。这个容器构造的时候需要一个Visual类型的Parent,然后在添加、删除Visual Child的时候,它的相应方法(Add,Remove)就会帮助我们自动调用Parent的AddVisualChild和RemoveVisualChild方法。如此一来,我们的工作量又减少了。

到此,相信大家对“WPF在VisualTree上怎么增加Visual”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

WPF在VisualTree上怎么增加Visual

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

WPF在VisualTree上怎么增加Visual

本篇内容主要讲解“WPF在VisualTree上怎么增加Visual”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“WPF在VisualTree上怎么增加Visual”吧!代码: class
2023-07-02

vue怎么在元素上增加样式

增加方法:1、用“:class="['类名']”语句添加;2、用“:class="['类名1','类名2',{属性名(类名):'属性值(true或false)}]"”语句;3、用“:class="{属性名(类名):true}”语句;4、用“:style="{'样式名':'样式值'}"”语句;5、用“:style="样式"”语句增加;6、用“:style="[data]"”语句。
2023-05-14

sql怎么在原有表基础上增加一列

这篇文章主要介绍“sql怎么在原有表基础上增加一列”,在日常操作中,相信很多人在sql怎么在原有表基础上增加一列问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”sql怎么在原有表基础上增加一列”的疑惑有所帮助!
2023-06-20

sql怎么在原有的数据上增加数值

要在原有的数据上增加数值,可以使用UPDATE语句。以下是一个示例:假设有一个名为"table_name"的表,其中有一个名为"column_name"的列,我们想要在原有的数据上增加一个数值。```sqlUPDATE table_name
2023-10-10

怎么在html中增加一行

怎么在html中增加一行?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。html表格新增一行和删除一行主要思路:现在页面中写一段你想要的html代码样式,然后设置
2023-06-15

php怎么在数组中增加数据

这期内容当中小编将会给大家带来有关php在数组中增加数据的方法,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。php数组,顾名思义就是PHP中的数组。其特点就是将values映射到keys的类型。与其他语言不同的是,PH
2023-05-31

怎么在JavaScript页面中增加元素

怎么在JavaScript页面中增加元素?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。方法:1、使用“getElementsByTagName()”获取父节点元
2023-06-15

oracle怎么在指定位置增加列

要在Oracle数据库中的指定位置增加列,需要使用ALTER TABLE语句并指定新列的位置。以下是一个示例:ALTER TABLE table_nameADD column_name datatypeAFTER existing_c
oracle怎么在指定位置增加列
2024-04-09

java怎么在list中增加一条数据

要在Java的List中添加一条数据,可以使用add()方法。示例代码如下:import java.util.*;public class Main {public static void main(String[] args) {Li
2023-10-27

oracle怎么在指定位置增加字段

在Oracle数据库中,要在指定位置增加字段,可以使用ALTER TABLE语句的ALTER COLUMN子句,具体步骤如下:首先使用DESC表名查看表的结构,确定要增加字段的位置。使用ALTER TABLE语句,指定要增加字段的表名,并使
oracle怎么在指定位置增加字段
2024-05-21

win10怎么在桌面上新增便签

这篇文章主要介绍“win10怎么在桌面上新增便签”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win10怎么在桌面上新增便签”文章能帮助大家解决问题。具体的设置方法如下:1.点击电脑屏幕左下角的开始
2023-06-27

php怎么在数组中间增加元素

在php中,可以利用array_splice()函数来在数组中间增加元素,只需要将该函数的第二个参数设置为大于0且小于“数组长度-1”的数值即可,语法“array_splice(数组,要插入的索引位置,0,元素值)”。
2016-06-06

sqlserver怎么在指定列后增加一列

在 SQL Server 中,可以使用 ALTER TABLE 语句来在指定列后增加一列。以下是示例代码:ALTER TABLE table_nameADD column_name datatype AFTER existing_col
sqlserver怎么在指定列后增加一列
2024-04-09

php怎么在字符串首部增加字符

两种实现方法:1、使用字符串连接符“.”将指定字符拼接在字符串开头即可,语法“指定字符 . 字符串”;2、使用substr_replace()函数在字符串开头插入指定字符串,只需要将该函数的第二个参数设置为指定字符,第三个和第四个参数设置为0即可,语法“substr_replace(字符串,指定字符,0,0)”。本教程操作环境:windows7系统、PHP8.1版、DELL G3电脑在PHP中,可以
2022-08-16

MySQL怎么在原有的表中增加一列

本篇内容介绍了“MySQL怎么在原有的表中增加一列”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL在原有的表中增加一列表已经建好了,
2023-07-05

怎么在python中为类动态增加方法

这篇文章将为大家详细讲解有关怎么在python中为类动态增加方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录