无法解析样式属性“边距”。 ...使用Class.Property语法指定属性

时间:2018-06-21 15:21:37

标签: wpf attached-properties wpf-style

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不会与很多无趣的样式代码聚集在一起。为什么我不能将其添加到样式中?

0 个答案:

没有答案