你的位置:首页 > 软件开发 > ASP.net > 通过Measure Arrange实现UWP瀑布流布局

通过Measure Arrange实现UWP瀑布流布局

发布时间:2015-08-20 14:00:16
简介在以XAML为主的控件布局体系中,有用于完成布局的核心步骤,分别是measure和arrange。继承体系中由UIElement类提供Measure和Arrange方法,并由其子类FrameworkElement类提供protected的MeasureOverride和Arr ...

通过Measure  Arrange实现UWP瀑布流布局

简介

在以XAML为主的控件布局体系中,有用于完成布局的核心步骤,分别是measure和arrange。继承体系中由UIElement类提供Measure和Arrange方法,并由其子类FrameworkElement类提供protected的MeasureOverride和ArrangeOverride方法来为自定义控件提供实现自定义布局的接口。本文通过一个瀑布流布局实现来为大家简单地介绍这两个核心方法。

所谓瀑布流布局,是多列布局的一种形式,列中元素等比缩放使得自身与列等宽,每列再以StackPanel的形式布局,下一个元素自动排布到最短的那一列上。

大致效果可以参考百度图片首页,点击“摄影”,“美食”或“宠物”后进入的页面效果。(宠物here:http://image.baidu.com/channel?c=%E5%AE%A0%E7%89%A9&t=%E5%85%A8%E9%83%A8&s=0)

 

MeasureOverride方法

一言以蔽之,获取大小。

每个控件有提供给外部调用的Measure方法,用来决定该控件需要的空间。这个方**对布局设置进行简单的处理,比如对Margin等属性进行预处理,然后把主要的步骤交给MeasureOverride方法。

这一方法的参数代表了该控件本身能拥有的大小。布局时需要考虑到它。

在这一方法中,控件需要做的就是遍历所有子控件,并调用他们的Measure方法,按照自己的布局方式对这些空间的大小进行运算。最后递归出一个总的空间大小,然后返回给它的父控件。

在这一过程中,按照需要,可能连子控件的位置信息也需要考虑(比如我们的瀑布流)。

所有的控件在计算完自己的所需控件后,会设置自己的DesiredSize属性,表明它所需的尺寸。这一属性在之后的Arrange过程中可以使用(不过不要在非自定义布局的情况下使用哦)。

此时控件和子控件的大小都已经确定了。

 

我们通过继承Panel来实现自己的瀑布流布局,这么做的目的,主要是可以将Panel用于ItemsControl及其子类的ItemsPanel属性(Panel类此时或许可以有另一个名字:LayoutPolicy)。配合ItemTemplate和ItemsSource,可以方便的填充和具象数据。

 

让我们看看如何实现一个这样行为的MeasureOverride:

protected override Size MeasureOverride(Size availableSize){  // 记录每个流的长度。因为我们用选取最短的流来添加下一个元素。  KeyValuePair<double, int>[] flowLens = new KeyValuePair<double, int>[2];  foreach (int idx in Enumerable.Range(0, 2))  {    flowLens[idx] = new KeyValuePair<double, int>(0.0, idx);  }   // 我们就用2个纵向流来演示,获取每个流的宽度。  double flowWidth = availableSize.Width / 2;  // 为子控件提供沿着流方向上,无限大的空间  Size elemMeasureSize = new Size(flowWidth, double.PositiveInfinity);   foreach (UIElement elem in Children)  {    // 让子控件计算它的大小。    elem.Measure(elemMeasureSize);    Size elemSize = elem.DesiredSize;     double elemLen = elemSize.Height;    var pair = flowLens[0];     // 子控件添加到最短的流上,并重新计算最短流。    // 因为我们为了求得流的长度,必须在计算大小这一步时就应用一次布局。但实际的布局还是会在Arrange步骤中完成。    flowLens[0] = new KeyValuePair<double, int>(pair.Key + elemLen, pair.Value);    flowLens = flowLens.OrderBy(p => p.Key).ToArray();  }   return new Size(availableSize.Width, flowLens.Last().Key);

原标题:通过Measure Arrange实现UWP瀑布流布局

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录