资源描述:
《自定义WPF布局面板.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、WPF学习如何自定义WPF布局面板 WPF拥有很多布局面板,比如Grid,StackPanel等,这让我们的界面布局更加的灵活,但也许这些面板并不能完全满足你的需求,这时你需要自定义面板来满足你的布局要求。 1,面板布局是如何实现的 WPF布局引擎采用了一种递归的方式来实现控件及其子控件的布局,大致过程是这样的:要实现控件A的布局,那么先要实现A的子控件a1,a2,a3...的布局,要实现a1的布局,那么得实现a1的子控件a11,a12,a13...的布局,如此循环,然后但子控件的布局完成后,在完成父控件的布局,最后递归回去,递归结束,布局才算完成. 控件的最终大小和位置是由该控件
2、和父控件相磋商来完成的,父控件先给出其能给予子控件的力所能及的布局空间,子控件在反馈给父控件一个自己的期望值,父控件最后根据自己所拥有的空间大小与子控件的期望值分配一定的空间给子控件并返回自己的大小.这一系列过程是通过重写面板的MeasureOverride和ArrangeOverride方法来完成的. 2,SizeMeasureOverride(SizeavailableSize)方法 该方法为布局中控件所需要的空间大小进行评估。 参考如下代码:以下是引用片段: protected override Size MeasureOverride(Size availableSize)
3、 { Size childrenSize = new Size(0, 0); foreach (UIElement child in this.Children) { child.Measure(new Size(Double.PositiveInfinity,Double.PositiveInfinity)); childrenSize.Width += child.DesiredSize.Width; childrenSize.Height += child.DesiredSize.Height; } return childrenSize;
4、} 在MeasureOverride阶段我们对面板中的每个Child调用了其Measure(Sizesz)方法,该方法的作用是父控件告诉子控件其预计要分配给子控件的空间大小,对Child调用了该Measure方法后,子控件会在其内部给父控件一个回应以便告诉父控件它所期望的大小,而子控件的该期望值便保存在其child.DesiredSize中.如果Measure方法中传入的是正无穷大(newSize(Double.PositiveInfinity,Double.PositiveInfinity))时,相当于父控件在对子控件说"尽管说出你所需要的大小吧,如果可以的话全世界都可以给你". M
5、easureOverrice方法中的availableSize参数正是其父控件(你编写的面板控件以后在实际使用时其父控件)对其调用Measure方法时传入的值(减去一些边界值,比如要减掉Margin等) MeasureOverride方法的返回值正是其告诉其父控件的期望值,即是其父控件(你编写的面板控件以后在实际使用时其父控件)对其调用Measure方法后,其DesiredSize值 注意:作为父控件,你可以很慈爱地仅可能地满足子控件的需要(尽管不一定有这能力),所以可以在对子控件调用Measure方法时传入一个正无穷大的尺寸,但作为子控件,你不能贪婪地向父控件索要正无穷大的空间,所以
6、我们不能将正无穷大作为MeasureOverride方法的返回值,也不能直接将该方法的availableSize参数作为返回值(因为你的父控件有可能将正无穷大作为该参数传递给你) 3,SizeArrangeOverride(SizefinalSize)方法 该方法作用在于为面板子控件提供布局空间即排列子控件并返回自身大小 参考下面的代码:以下是引用片段: protected override Size ArrangeOverride(Size finalSize) { Point childPos = new Point(0, 0); foreach (UIEle
7、ment child in this.Children) { child.Arrange(new Rect(childPos, new Size(child.DesiredSize.Width, finalSize.Height))); childPos.X += child.RenderSize.Width; } return finalSize; } 该方法对每个Child调用Arran