zoukankan      html  css  js  c++  java
  • WPF的逻辑树与视觉树(3)Visual呈现

        这篇就点到为止,挑重点讲

    绘图方式有两种


    1.继承UIElement,重写OnRender方法

    public partial class Window5 : Window
    {
        public Window5()
        {
            InitializeComponent();
            this.Content = new RectangleElement();
        }
    }
    
    public class RectangleElement : UIElement
    {
        protected override void OnRender(DrawingContext drawingContext)
        {
            drawingContext.DrawRectangle(Brushes.Red, null, new Rect(0, 0, 100, 20));
            base.OnRender(drawingContext);
        }
    }
    

    2.DrawingVisual 轻量级绘图,只提供显示和测试点击功能,DrawingVisual继承自ContainerVisual,所以其也是Visual集合容器

    public class RectangleElement : UIElement
    {
        DrawingVisual visual; 
        public RectangleElement()
        {
            visual = new DrawingVisual();
            var drawingContext = visual.RenderOpen();
            drawingContext.DrawRectangle(Brushes.Red, null, new Rect(0, 0, 100, 20));
            drawingContext.Close();
            this.AddVisualChild(visual);
        }
    
        protected override Visual GetVisualChild(int index)
        {
            return visual;
        }
    
        protected override int VisualChildrenCount
        {
            get
            {
                return 1;
            }
        }
    }
    


    DrawingVisual无法单独存在,必须放在一个容器中(需要有布局系统)呈现.我们看到每次添加一个Visual的时候,总还是难免要实现GetVisualChild和VisualChildrenCount这两个成员.除了ContainerVisual这些轻量级的对象,Panel会帮我们做掉上面这些工作.但基类却变成了UIElement.事实上当添加Visual以后,同时还要计算布局的尺寸,所以有必要的话,可以对UIElement或者FrameworkElement重写以上两个成员。因为有时候我们只需要一次布局和添加多个Visual,以提升性能

    重写默认窗体的视觉树

    public partial class Window5 : Window
    {
        DrawingVisual dv;
        public Window5()
        {
            InitializeComponent();
            dv = new DrawingVisual();
        }
    
        protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
        {
            var drawingContext = dv.RenderOpen();
            drawingContext.DrawRectangle(Brushes.Red, null, new Rect(0, 0, this.ActualWidth, ActualHeight));
            drawingContext.Close();
            base.OnRenderSizeChanged(sizeInfo);
        }
    
        protected override Visual GetVisualChild(int index)
        {
            return dv;
        }
    }
    
    重写后的窗体视觉树达到了最小化
    image

    上面看到并没有调用AddVisualChild方法,而视觉树的判断依据还是根据GetVisualChild和VisualChildrenCount,不过还是乖乖地加上AddVisualChild方法以免出现什么问题.

  • 相关阅读:
    第3章 结束会话端点(EndSession Point)
    第2章 授权端点(Authorize Endpoint)
    第1章 发现端点(Discovery Endpoint)
    欢迎使用IdentityModel文档!- IdentityModel 中文文档(v1.0.0)
    IdentityModel 中文文档(v1.0.0) 目录
    第66章 视频
    第65章 博客帖子
    第64章 学习
    Jenkins Ant 自动编译部署测试环境
    jenkins+jmeter+ant自动化接口测试集成
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1794514.html
Copyright © 2011-2022 走看看