返回顶部
首页 > 资讯 > 精选 >WPF在VisualTree上怎么增加Visual
  • 607
分享到

WPF在VisualTree上怎么增加Visual

2023-07-02 13:07:21 607人浏览 安东尼
摘要

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

本篇内容主要讲解“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”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: WPF在VisualTree上怎么增加Visual

本文链接: https://lsjlt.com/news/342097.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • WPF在VisualTree上增加Visual
    作为一个WPF控件开发者,我在工作中经常遇到如本文标题所示的问题。其实,这个问题并不是很难,只是在操作上有些繁琐。本文将尝试对这个问题进行解答,并且对相关的一些技术细节加以探讨。 先...
    99+
    2024-04-02
  • WPF在VisualTree上怎么增加Visual
    本篇内容主要讲解“WPF在VisualTree上怎么增加Visual”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“WPF在VisualTree上怎么增加Visual”吧!代码: &nb...
    99+
    2023-07-02
  • vue怎么在元素上增加样式
    本教程操作环境:windows7系统、vue3版,DELL G3电脑。vue中的添加样式一、使用class样式:类名必须用引号 引起来;1、数组<h1 :class = "['类名1','类名2...
    99+
    2023-05-14
    Vue
  • sql怎么在原有表基础上增加一列
    这篇文章主要介绍“sql怎么在原有表基础上增加一列”,在日常操作中,相信很多人在sql怎么在原有表基础上增加一列问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”sql怎么在原有表基础上增加一列”的疑惑有所帮助!...
    99+
    2023-06-20
  • sql怎么在原有的数据上增加数值
    要在原有的数据上增加数值,可以使用UPDATE语句。以下是一个示例:假设有一个名为"table_name"的表,其中有一个名为"co...
    99+
    2023-10-10
    sql
  • 怎么在phpmyadmin增加用户
    这篇文章给大家分享的是有关怎么在phpmyadmin增加用户的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。如果访问和管理一个数据库系统的人员过多,那么并不是每一个用户都有必要访问...
    99+
    2024-04-02
  • 怎么在html中增加一行
    怎么在html中增加一行?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。html表格新增一行和删除一行主要思路:现在页面中写一段你想要的html代码样式,然后设置...
    99+
    2023-06-15
  • vue如何在元素上增加样式
    这篇文章主要介绍“vue如何在元素上增加样式”,在日常操作中,相信很多人在vue如何在元素上增加样式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue如何在元素上增加样式”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-05
  • wpf datagrid加载慢怎么解决
    WPF DataGrid 加载慢可能是由于数据量大或者数据处理复杂导致的。以下是一些解决方案:1. 使用虚拟化加载:启用虚拟化加载可...
    99+
    2023-10-18
    wpf
  • sqlserver怎么增加自增列
    要在SQL Server中增加自增列,可以使用IDENTITY属性。IDENTITY属性可以自动为列生成唯一的递增值。 以下是在SQ...
    99+
    2024-04-09
    sqlserver
  • 怎么在JavaScript页面中增加元素
    怎么在JavaScript页面中增加元素?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。方法:1、使用“getElementsByTagName()”获取父节点元...
    99+
    2023-06-15
  • php怎么在数组中增加数据
    这期内容当中小编将会给大家带来有关php在数组中增加数据的方法,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。php数组,顾名思义就是PHP中的数组。其特点就是将values映射到keys的类型。与其他语言不同的是,PH...
    99+
    2023-05-31
    php 数组
  • oracle怎么在指定位置增加列
    要在Oracle数据库中的指定位置增加列,需要使用ALTER TABLE语句并指定新列的位置。以下是一个示例: ALTER TABL...
    99+
    2024-04-09
    oracle
  • win10怎么在桌面上新增便签
    这篇文章主要介绍“win10怎么在桌面上新增便签”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win10怎么在桌面上新增便签”文章能帮助大家解决问题。具体的设置方法如下:点击电脑屏幕左下角的开始菜单...
    99+
    2023-06-27
  • 详解如何在Ubuntu 16.04上增加Swap分区
    前言 提高服务器响应速度和防止应用程序内存不足错误的最简单方法之一是添加一些交换空间。 在本指南中,我们将介绍如何将交换文件添加到Ubuntu 16.04服务器。 但是,请注意: 尽管swap区通常建议用于使用传统旋转硬...
    99+
    2022-06-04
    swap分区 Ubuntu 16.04 Swap分区
  • php怎么在数组中间增加元素
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php在数组中间增加元素在php中,可以利用array_splice()函数来在数组中间增加元素。array_splice($array,$start,$length,...
    99+
    2016-06-06
    php 数组 数组增加元素
  • java怎么在list中增加一条数据
    要在Java的List中添加一条数据,可以使用add()方法。 示例代码如下: import java.util.*; publi...
    99+
    2023-10-27
    java
  • sqlserver怎么在指定列后增加一列
    在 SQL Server 中,可以使用 ALTER TABLE 语句来在指定列后增加一列。以下是示例代码: ALTER TABLE ...
    99+
    2024-04-09
    sqlserver
  • oracle怎么在指定位置增加字段
    在Oracle数据库中,要在指定位置增加字段,可以使用ALTER TABLE语句的ALTER COLUMN子句,具体步骤如下: ...
    99+
    2024-05-21
    oracle
  • standby上增加tempfile报错ORA-00604,ORA-16000怎么办
    这篇文章主要介绍standby上增加tempfile报错ORA-00604,ORA-16000怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在DG中对primary增加temp...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作