自定义WPF布局面板

WPF学习如何自定义WPF布局面板WPF拥有很多布局面板,比如Grid,StackPanel等,这让我们的界面布局更加的灵活,但也许这些面板并不能完全满足你的需求,这时你需要自定义面板来满足你的布局要求。1,面板布局是如何实现的WPF布局引擎采用了一种递归的方式来实现控件及其子控件的布局,大致过程是这样的:要实现控件A的布局,那么先要实现A的子控件a1,a2,a3...的布局,要实现a1的布局,那么得实现a1的子控件a11,a12,a13...的布局,如此循环,然后但子控件的布局完成后,在完成父控件的布局,最后递归回去,递归结束,布局才算完成.控件的最终大小和位置是由该控件和父控件相磋商来完成的,父控件先给出其能给予子控件的力所能及的布局空间,子控件在反馈给父控件一个自己的期望值,父控件最后根据自己所拥有的空间大小与子控件的期望值分配一定的空间给子控件并返回自己的大小.这一系列过程是通过重写面板的MeasureOverride和ArrangeOverride方法来完成的.2,SizeMeasureOverride(SizeavailableSize)方法该方法为布局中控件所需要的空间大小进行评估。参考如下代码:以下是引用片段:protectedoverrideSizeMeasureOverride(SizeavailableSize){SizechildrenSize=newSize(0,0);foreach(UIElementchildinthis.Children){child.Measure(newSize(Double.PositiveInfinity,Double.PositiveInfinity));childrenSize.Width+=child.DesiredSize.Width;childrenSize.Height+=child.DesiredSize.Height;}returnchildrenSize;}在MeasureOverride阶段我们对面板中的每个Child调用了其Measure(Sizesz)方法,该方法的作用是父控件告诉子控件其预计要分配给子控件的空间大小,对Child调用了该Measure方法后,子控件会在其内部给父控件一个回应以便告诉父控件它所期望的大小,而子控件的该期望值便保存在其child.DesiredSize中.如果Measure方法中传入的是正无穷大(newSize(Double.PositiveInfinity,Double.PositiveInfinity))时,相当于父控件在对子控件说"尽管说出你所需要的大小吧,如果可以的话全世界都可以给你".MeasureOverrice方法中的availableSize参数正是其父控件(你编写的面板控件以后在实际使用时其父控件)对其调用Measure方法时传入的值(减去一些边界值,比如要减掉Margin等)MeasureOverride方法的返回值正是其告诉其父控件的期望值,即是其父控件(你编写的面板控件以后在实际使用时其父控件)对其调用Measure方法后,其DesiredSize值注意:作为父控件,你可以很慈爱地仅可能地满足子控件的需要(尽管不一定有这能力),所以可以在对子控件调用Measure方法时传入一个正无穷大的尺寸,但作为子控件,你不能贪婪地向父控件索要正无穷大的空间,所以我们不能将正无穷大作为MeasureOverride方法的返回值,也不能直接将该方法的availableSize参数作为返回值(因为你的父控件有可能将正无穷大作为该参数传递给你)---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---3,SizeArrangeOverride(SizefinalSize)方法该方法作用在于为面板子控件提供布局空间即排列子控件并返回自身大小参考下面的代码:以下是引用片段:protectedoverrideSizeArrangeOverride(SizefinalSize){PointchildPos=newPoint(0,0);foreach(UIElementchildinthis.Children){child.Arrange(newRect(childPos,newSize(child.DesiredSize.Width,finalSize.Height)));childPos.X+=child.RenderSize.Width;}returnfinalSize;}该方法对每个Child调用Arrange方法,Arrange方法中传入的Rect结构告诉子控件其被安排在那个空间内进行布局,然后子元素会根据自己得到的空间以及自己的对齐属性(XXXAlignment)进行放置,放置完成后子控件的大小等便得到了确定,而该值便存放在子控件的RenderSize中(即是ActualWidth与ActualHeight).控件本身也可以根据子控件占用的实际空间大小来决定自己的大小,也可以直接将得到的空间大小(即是ArrangeOverride方法中的finalSize参数)作为自己的最终大小返回ArrangeOverride方法中的finalSize参数是该控件的父控件(你编写的面板控件以后在实际使用时其父控件)在对该控件调用Arrange方法时传入的Rect的大小,正如该控件对其子控件调用Arrange方法一样.注意:Child的Arrange方法只是给定一个空间让子控件在此空间内进行摆放,该空间并没有决定子控件的具体位置和大小,这还得取决于子控件的其它属性,比如HorizontalAlignment与VerticalAlignment等.在Arrange期间,系统会自动进行对齐(Alignment)操作。下图是自定义的面板MyStackPanel,其比WPF内置的StackPanel多了两个方向上的布局("从右到左"与"从下到上")---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?