在StackPanel中设置项目间距的简便方法是什么?

有没有一种简单的方法来设置StackPanel内的项目之间的默认空间,所以我不必在每个项目上设置Margin属性?

如果所有控件都相同,那么就像IanR建议的那样,并实现一个捕获该控件的Style。 如果不是那么你就不能为基类创建默认样式,因为它不起作用。

这种情况的最佳方法是使用非常巧妙的技巧 – 附加属性(也称为WPF4中的行为)

你可以创建一个具有附加属性的类,如下所示:

public class MarginSetter { public static Thickness GetMargin(DependencyObject obj) { return (Thickness)obj.GetValue(MarginProperty); } public static void SetMargin(DependencyObject obj, Thickness value) { obj.SetValue(MarginProperty, value); } // Using a DependencyProperty as the backing store for Margin. This enables animation, styling, binding, etc... public static readonly DependencyProperty MarginProperty = DependencyProperty.RegisterAttached("Margin", typeof(Thickness), typeof(MarginSetter), new UIPropertyMetadata(new Thickness(), CreateThicknesForChildren)); public static void CreateThicknesForChildren(object sender, DependencyPropertyChangedEventArgs e) { var panel = sender as Panel; if (panel == null) return; foreach (var child in panel.Children) { var fe = child as FrameworkElement; if (fe == null) continue; fe.Margin = MarginSetter.GetMargin(panel); } } } 

现在,要使用它,您需要做的就是将此附加属性附加到您想要的任何面板,如下所示:

       

当然完全可以重复使用。

我使用透明分隔符,效果很好:

  

您当然可以使用边距,但如果您想更改边距,则必须更新所有元素。

分隔符甚至可以在静态资源中设置样式。

一个附属的财产也可以做到,但我认为这是过度的。

我发现在堆栈面板中创建一个网格,然后添加所需数量的列(或行),如下所示: