博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】【WPF】WPF中MeasureOverride ArrangeOverride 的理解
阅读量:5777 次
发布时间:2019-06-18

本文共 3773 字,大约阅读时间需要 12 分钟。

1. Measure Arrange这两个方法是UIElement的方法

    MeasureOverride ArrangeOverride这两个方法是FrameworkElement的方法,FrameworkElement是UIElement的子类

    MeasureOverride传入父容器分配的可用空间,返回该容器根据其子元素大小计算确定的在布局过程中所需的大小。

    ArrangeOverride传入父容易最终分配的控件大小,返回使用的实际大小

2. MeasureOverride 用于计算本身及其子控件的大小

    ArrangeOverride用于布局本身及其子控件的位置和大小

3. WPF布局系统大概分为两步:Measure和Arrange

    Measure方法自顶而下,递归调用各子控件的Measure方法,Measure方法会把该控件所需的大小控件存在desired size属性中,控件根据各子控件的desired size 属性确定自身空间大小,并返回自己的desired size 

   Arrange方法发生在Measure中,传入Measure方法计算到的大小,利用控件的位置设置分配子控件的位置

简单来说,这两个方法一个管大小,一个管布局,都需要调用子类的Measure和Arrage

 

public class DiagnolPanel:Panel    {        protected override Size MeasureOverride(Size availableSize)        {            var mySize = new Size();            foreach (UIElement child in this.InternalChildren)            {                child.Measure(availableSize);                mySize.Width += child.DesiredSize.Width;                mySize.Height += child.DesiredSize.Height;            }            return mySize;        }            protected override Size ArrangeOverride(Size finalSize)        {            var location = new Point();            int childNumber = 0;            int middleChild = GetTheMiddleChild(this.InternalChildren.Count);            foreach (UIElement child in this.InternalChildren)            {                               if (childNumber < middleChild)                {                    child.Arrange(new Rect(location, child.DesiredSize));                    location.X += child.DesiredSize.Width;                    location.Y += child.DesiredSize.Height;                }                else                {                    //The x location will always keep increasing, there is no need to take care of it                    location.X = GetXLocationAfterMiddleChild(childNumber);                    //If the UIElements are odd in number                    if (this.InternalChildren.Count % 2 != 0)                    {                         //We need to get the Y location of the child before middle location,                         //to have the same Y location for the child after middle child                                              int relativeChildBeforeMiddle = middleChild - (childNumber - middleChild);                        location.Y = GetYLocationAfterMiddleChild(relativeChildBeforeMiddle);                    }                    else                    {                       ///TODO: Do the design for the even number of children                    }                    child.Arrange(new Rect(location, child.DesiredSize));                }                childNumber++;            }            return finalSize;        }        private double GetXLocationAfterMiddleChild(int childNUmber)        {            double xLocation = 0;            for (int i = 0; i < childNUmber; i++)            {                xLocation += this.InternalChildren[i].DesiredSize.Width;            }            return xLocation;        }        private double GetYLocationAfterMiddleChild(int relativeChildNumber)        {                        UIElement correspondingChild = this.InternalChildren[relativeChildNumber - 2];            Point pointCoordinates =             correspondingChild.TransformToAncestor((Visual)this.Parent).Transform(new Point(0, 0));            return pointCoordinates.Y;        }        private int GetTheMiddleChild(int count)        {            int middleChild;            if (count % 2 == 0)            {                middleChild = count / 2;            }            else            {                middleChild = (count / 2) + 1;            }            return middleChild;        }    }}

 

原文地址:

    

转载地址:http://ayuyx.baihongyu.com/

你可能感兴趣的文章
Membership三步曲之进阶篇 - 深入剖析Provider Model
查看>>
huffman编码——原理与实现
查看>>
Linux移植随笔:终于解决Tslib的问题了【转】
查看>>
MyBitis(iBitis)系列随笔之四:多表(多对一查询操作)
查看>>
【leetcode】Longest Common Prefix
查看>>
前端优化及相关要点总结
查看>>
Vue 列表渲染
查看>>
struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
查看>>
25 个精美的手机网站模板
查看>>
C#反射实例应用--------获取程序集信息和通过类名创建类实例
查看>>
VC中实现文字竖排的简单方法
查看>>
会话标识未更新
查看>>
【设计模式】数据访问对象模式
查看>>
Tomcat8 配置Oracle11g数据源
查看>>
【PHP面向对象(OOP)编程入门教程】8.构造方法__construct()与析构方法__destruct()
查看>>
ThinkPHP常用配置路径
查看>>
阿里架构师:程序员必须掌握的几项核心技术能力
查看>>
程序员常用的六大技术博客类
查看>>
vue中动画的实现的几种方式
查看>>
Iceworks 2.8.0 发布,自定义你的 React 模板
查看>>