在HTML中,对于表格(至少),可以设置元素的样式,以便合并边距。即,两个相邻行的上边距和下边距都为10,因此这两行之间差距为20。当它们的边距合并时,间距仅为10。在WPF中有什么方法可以实现这一点吗?
kxkpmulp1#
没有简单的方法可以做到这一点,当您查看WPF如何处理布局时,您会明白其中的原因,但也会看到,如果您能做到这一点,这是一种困难的方法。正如您可以从FrameworkElement的WPF source code中看到的,MeasureCore密封重写方法(这防止我们进一步覆盖它)在返回所需大小之前添加元素的边距。令人讨厌的是,他们似乎有一个BypassLayoutPolicies选项可以防止这一点,但原因可能包括短视和虐待狂,他们把这个internal做出来了,所以它不是一个选项。因此,元素的完全有边距的大小总是被分配给DesiredSize,这基本上是所有布局面板(StackPanel)等在ArrangeOverride期间天真地用来安排项目的。但如果你愿意将所有面板子类化并覆盖它们的MeasureOverride和ArrangeOverride,这里有一个解决方案。知道了两个相邻子面板的边距值,你就可以在测量和排列过程中将它们各自的右/左或下/上边距折叠在一起,只需从它们的'DesiredSize'中减去边距的重复部分。但如果您无论如何都要子类化,另一个选择(我认为总体上更简洁、更好的做法)是向子类化的Panel添加一个Spacing属性,该属性存在于WinUI version of StackPanel .中。这将要求您要么确保子项都具有零边距,或者从它们的DesiredSize值中减去它们的实际边距值。然后在排列过程中在项目之间添加此间距。StackPanel很容易用这种方式扩展,因为这两个通道都非常简单。不幸的是,Grid要复杂得多。VirtualizingStackPanel可能不可能......所以这绝不是一个银的解决方案,但考虑到StackPanel是多么常见,即使只是扩展该控件也会覆盖大量的地面,并导致更干净的布局IMO。
FrameworkElement
MeasureCore
BypassLayoutPolicies
internal
DesiredSize
StackPanel
ArrangeOverride
MeasureOverride
Spacing
Grid
VirtualizingStackPanel
sxpgvts32#
如果我有更高的声誉,我会将其标记为Is it possible to emulate border-collapse (ala CSS) in a WPF ItemsControl?的副本。它看起来像是可组装的(至少对于ListBox),使用DataTrigger检查前面条目的值,并相应地为空值设置边框。
2条答案
按热度按时间kxkpmulp1#
没有简单的方法可以做到这一点,当您查看WPF如何处理布局时,您会明白其中的原因,但也会看到,如果您能做到这一点,这是一种困难的方法。
正如您可以从
FrameworkElement
的WPF source code中看到的,MeasureCore
密封重写方法(这防止我们进一步覆盖它)在返回所需大小之前添加元素的边距。令人讨厌的是,他们似乎有一个BypassLayoutPolicies
选项可以防止这一点,但原因可能包括短视和虐待狂,他们把这个internal
做出来了,所以它不是一个选项。因此,元素的完全有边距的大小总是被分配给DesiredSize
,这基本上是所有布局面板(StackPanel
)等在ArrangeOverride
期间天真地用来安排项目的。但如果你愿意将所有面板子类化并覆盖它们的
MeasureOverride
和ArrangeOverride
,这里有一个解决方案。知道了两个相邻子面板的边距值,你就可以在测量和排列过程中将它们各自的右/左或下/上边距折叠在一起,只需从它们的'DesiredSize'中减去边距的重复部分。但如果您无论如何都要子类化,另一个选择(我认为总体上更简洁、更好的做法)是向子类化的Panel添加一个
Spacing
属性,该属性存在于WinUI version ofStackPanel
.中。这将要求您要么确保子项都具有零边距,或者从它们的DesiredSize
值中减去它们的实际边距值。然后在排列过程中在项目之间添加此间距。StackPanel
很容易用这种方式扩展,因为这两个通道都非常简单。不幸的是,Grid
要复杂得多。VirtualizingStackPanel
可能不可能......所以这绝不是一个银的解决方案,但考虑到StackPanel
是多么常见,即使只是扩展该控件也会覆盖大量的地面,并导致更干净的布局IMO。sxpgvts32#
如果我有更高的声誉,我会将其标记为Is it possible to emulate border-collapse (ala CSS) in a WPF ItemsControl?的副本。它看起来像是可组装的(至少对于ListBox),使用DataTrigger检查前面条目的值,并相应地为空值设置边框。