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

标签 wpf xaml margin

在 HTML 中,对于表格(至少),可以设置元素的样式以便合并边距。 IE。相邻两行的上边距和下边距均为 10,因此这两行之间的间距为 20。当它们的边距合并时,间距仅为 10。

有什么方法可以在 WPF 中实现这一点吗?

最佳答案

没有简单的方法可以做到这一点,当您查看 WPF 如何处理布局时,您会明白原因,但也会发现如果您愿意的话,还有一个困难的方法。

正如您从 FrameworkElementWPF source code 中看到的那样,MeasureCore 密封覆盖方法(防止我们进一步覆盖它)在返回所需元素之前添加元素的边距尺寸。令人恼火的是,他们似乎有一个 BypassLayoutPolicies 选项可以防止这种情况发生,但出于可能从短视到虐待狂的原因,他们将此设为 internal,所以它不是一个选项。因此,元素的完全边距大小总是最终分配给 DesiredSize,这基本上是所有布局面板 (StackPanel) 等天真地用来排列项目的内容在 ArrangeOverride 期间。

但是这就是解决方案,如果您愿意将所有面板子类化并覆盖它们的 MeasureOverrideArrangeOverride。知道两个相邻子项的边距值后,您可以在测量和排列过程中将它们各自的右/左或下/上边距折叠在一起,方法是从它们的“DesiredSize”中减去边距的重复部分。

但是,如果您仍然要进行子类化,另一种选择(我认为整体上更清洁和更好的做法)是将 Spacing 属性添加到您的子类化面板中,该属性存在于 WinUI version of StackPanel. This将要求您确保您的子项的边距均为零,或者从它们的 DesiredSize 中减去它们的实际边距值。然后,您可以在排列过程中在项目之间添加此间距。

StackPanel 很容易以这种方式进行扩展,因为这两个过程都非常简单。不幸的是,Grid 要复杂得多。 VirtualizingStackPanel 可能是不可能的...所以这绝不是 Elixir ,但考虑到 StackPanel 的普遍性,即使只是扩展该控件也可以覆盖整个很多地面并导致更清洁的布局 IMO。

关于wpf - 有没有办法在 WPF 中合并边距?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28849450/

相关文章:

WPF 依赖属性解决方法

c# - 在 Xamarin.Forms 中以编程方式引发控件事件

silverlight - DataTrigger 未在 Silverlight 中使用 GoToStateAction

c# - ListView 项目内的 UWP 按钮

xcode - 初学者 swift Sprite 工具包 - arc4random 和获取屏幕大小

c# - 使用 MVVM 的嵌套动态内容控件

c# - WPF, EF : Show and save ordering of rows in datagrid, mvvm

c# - WPF 进度条在几条之后停止

html - div 的颜色在外边距之外

css - CSS 中的 CLEARANCE 到底是什么