文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

WPF在VisualTree上怎么增加Visual

2023-07-02 13:21

关注

本篇内容主要讲解“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

目标实现。

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

另外,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属性)中:

2、VisualCollection

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

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

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯