【WPF】完美的布局不留白:解决WrapPanel右侧留白问题

充分利用界面上的空间,是优秀软件界面布局设计的原则之一。如果布局上出现了大片的空白区域就会给人一种浪费和不谐调的感觉。如下图所示。

【WPF】完美的布局不留白:解决WrapPanel右侧留白问题

  我们把ListBox的ItemsPanel设置为一个WrapPanel。让里面的Items可以自动折行。但是这样在ListBox的右侧,会出现一块空白区。很多情况下,我们对于Item的大小并不很在意,这时我们会更希望Item的宽度可以随着整体宽度自动地调节。产生如下图所示的效果。

【WPF】完美的布局不留白:解决WrapPanel右侧留白问题

【WPF】完美的布局不留白:解决WrapPanel右侧留白问题

  但是系统自带的WrapPanel是做不到这一点的。这时我们就要用到自定义Panel了。看到上面的效果,可能有人会说用 UniformGrid不就行了?如果里面的Item 一直是像上面3*6的固定布局是可以用UniformGrid的。或是你愿意动态计算UniformGrid有几行几列也可以。WrapPanel的特点是能动态地根据宽度调节每行Item的个数。如下图所示。

【WPF】完美的布局不留白:解决WrapPanel右侧留白问题

  上面的自动缩放的WrapPanel的效果还是通过自定义Panel来实现的。类图如下。

【WPF】完美的布局不留白:解决WrapPanel右侧留白问题

  使用这种方式进行布局,需要对这个FillWrapPanel里的Item有一些特殊的要求。

  1. 不设置宽度、最小宽度、最大宽度。这些都在FillWrapPanel设置。

  2. 支持缩放。当Item变大时,内部布局也要随之改变,并保持合理布局。说得简单点。Item和Item内部的所有东西(TextBlock除外),都不要设置固定的宽度和高度即可。

  随便说几句关于自定义Panel的题外话。

  在之前的文章中,已经介绍过两种自定义Panel。一种是有缩放的,一种也是Wrap的。有人可能要问,能不能把这两种Panel结合起来做一个天下无双的无比强大的Panel呢?答案是,如果有特定的规则来约束,是可以的。这个规则要满足下面的要求。

  在此规则的约束下,通过界面的大小,可以唯一地确定内部所有Item的布局(大小和位置)。

  这个听上去很费话,但是在自己实现一个Panel的过程中,很容易陷入逻辑之中,而忽视了这个简单的约束条件。所以如果能定义出规则满足上面的条件,逻辑上就可以实现出这样的Panel。但是作为一个第三方控件,你还要考虑到使用者的理解力。如果一个Panel的正确使用要靠长篇的文档和丰富的示例来保证。那这个Panel多数会被闲置,因为很少有布局会复杂到同时具有这些功能。即使做得出来,用户用上去,也会觉得奇怪。最优美的,也应该是最自然的。

  在多数情况下,应该考虑用多个Panel的组合来实现复杂功能,而不是试图实现一个无比强大的自定义Panel。这才是符合软件设计模式的基本要求的。

  我们言归正传。从上面的Panel的类图中,其实也就可以看出其实现方式。先计算出每行需要放置多少个Item,再计算出第个Item的宽度也就行了。

  单独介绍一下FloorItemWidth的作用,这个属性用来设置是否让每个Item的宽度一定是个整数。如果宽度不是整数,TextBlock、Image等内容可能会变得很模糊。

  本文示例源代码或素材下载

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<:Arc> 是 WPF 中自定义的一个元素,可以用于显示圆角进度条。你可以使用该元素的 Stroke 和 StrokeThickness 属性来设置进度条的边框颜色和宽度,使用 StartAngle 和 EndAngle 属性来设置进度条的起始角度和结束角度,使用 ArcThickness 属性来设置进度条的厚度,使用 ArcBackground 和 ArcForeground 属性来设置进度条的背景色和前景色。具体使用方法可以参考下面的代码示例: ```xml <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ed="clr-namespace:WpfApp1" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <Style x:Key="ArcStyle" TargetType="{x:Type ed:Arc}"> <Setter Property="Stroke" Value="Gray"/> <Setter Property="StrokeThickness" Value="10"/> <Setter Property="ArcBackground" Value="LightGray"/> <Setter Property="ArcForeground" Value="Green"/> </Style> </Window.Resources> <Grid> <ed:Arc Style="{StaticResource ArcStyle}" StartAngle="0" EndAngle="360" ArcThickness="60" Value="50"/> </Grid> </Window> ``` 这段代码定义了一个使用自定义元素 <ed:Arc> 的窗口,在窗口中定义了一个名为 "ArcStyle" 的样式,用于设置进度条的外观属性。在 Grid 中使用 <ed:Arc> 元素,并将样式应用到该元素上,设置了 StartAngle 和 EndAngle 属性为 0 和 360,表示显示一个完整的圆形进度条,设置了 ArcThickness 属性为 60,表示进度条的厚度为 60,设置了 Value 属性为 50,表示当前进度为 50%。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值