在this guide之后,我尝试为StackPanel
获取一个附加属性,该属性在内部元素之间创建了相等的空间。大多数建议都包含带有Margin
的嵌套样式设置,但是总是会为第一个(或最后一个,取决于值集)元素创建一个,这是不希望的。
因此,我创建了一个附加属性,为除第一个孩子之外的所有UIElement
子对象添加了边距。
public class ElementArranger
{
public static Thickness GetMargin(DependencyObject obj)
{
return (Thickness)obj.GetValue(MarginProperty);
}
public static void SetMargin(DependencyObject obj, Thickness value)
{
obj.SetValue(MarginProperty, value);
}
public static readonly DependencyProperty MarginProperty =
DependencyProperty.RegisterAttached("Margin",
typeof(Thickness),
typeof(ElementArranger),
new UIPropertyMetadata(new Thickness(),
MarginChangedCallback));
public static void MarginChangedCallback(object sender,
DependencyPropertyChangedEventArgs eventArgs)
{
Panel panel = sender as Panel;
if (panel == null) { return; }
panel.Loaded += new RoutedEventHandler(PanelLoaded);
}
static void PanelLoaded(object sender, RoutedEventArgs eventArgs)
{
Panel panel = sender as Panel;
foreach (UIElement child in panel.Children.OfType<UIElement>().Skip(1))
{
FrameworkElement frameworkElement = child as FrameworkElement;
if (frameworkElement == null) { continue; }
frameworkElement.Margin = ElementArranger.GetMargin(panel);
}
}
}
然后我将其添加到样式中:
<Style x:Key="ElementListLayoutStyle" TargetType="{x:Type Panel}">
<Setter Property="styles:ElementArranger.Margin" Value="10"/>
</Style>
但这只会引发异常:
无法解析样式属性“页边距”。确认拥有的类型是Style的TargetType,或使用Class.Property语法指定Property。
但是我不是在这里使用Class.Property语法吗?我可以将附加的属性添加到面板本身,并且可以工作,但是我想将资源字典xaml文件中的所有样式属性外包,这样实际的xamls不会与很多无趣的样式代码聚集在一起。为什么我不能将其添加到样式中?