有没有办法在WPF中合并页边距?

nwo49xxi  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(219)

在HTML中,对于表格(至少),可以设置元素的样式,以便合并边距。即,两个相邻行的上边距和下边距都为10,因此这两行之间差距为20。当它们的边距合并时,间距仅为10。
在WPF中有什么方法可以实现这一点吗?

kxkpmulp

kxkpmulp1#

没有简单的方法可以做到这一点,当您查看WPF如何处理布局时,您会明白其中的原因,但也会看到,如果您能做到这一点,这是一种困难的方法。
正如您可以从FrameworkElementWPF source code中看到的,MeasureCore密封重写方法(这防止我们进一步覆盖它)在返回所需大小之前添加元素的边距。令人讨厌的是,他们似乎有一个BypassLayoutPolicies选项可以防止这一点,但原因可能包括短视和虐待狂,他们把这个internal做出来了,所以它不是一个选项。因此,元素的完全有边距的大小总是被分配给DesiredSize,这基本上是所有布局面板(StackPanel)等在ArrangeOverride期间天真地用来安排项目的。
但如果你愿意将所有面板子类化并覆盖它们的MeasureOverrideArrangeOverride,这里有一个解决方案。知道了两个相邻子面板的边距值,你就可以在测量和排列过程中将它们各自的右/左或下/上边距折叠在一起,只需从它们的'DesiredSize'中减去边距的重复部分。
但如果您无论如何都要子类化,另一个选择(我认为总体上更简洁、更好的做法)是向子类化的Panel添加一个Spacing属性,该属性存在于WinUI version of StackPanel .中。这将要求您要么确保子项都具有零边距,或者从它们的DesiredSize值中减去它们的实际边距值。然后在排列过程中在项目之间添加此间距。
StackPanel很容易用这种方式扩展,因为这两个通道都非常简单。不幸的是,Grid要复杂得多。VirtualizingStackPanel可能不可能......所以这绝不是一个银的解决方案,但考虑到StackPanel是多么常见,即使只是扩展该控件也会覆盖大量的地面,并导致更干净的布局IMO。

sxpgvts3

sxpgvts32#

如果我有更高的声誉,我会将其标记为Is it possible to emulate border-collapse (ala CSS) in a WPF ItemsControl?的副本。它看起来像是可组装的(至少对于ListBox),使用DataTrigger检查前面条目的值,并相应地为空值设置边框。

相关问题