【问题标题】:WPF Attached property not working for setting HorizontalAlignment in child elementsWPF 附加属性不适用于在子元素中设置 Horizo​​ntalAlignment
【发布时间】:2013-07-11 12:54:20
【问题描述】:

在我们的 WPF 4.0 项目(不是 Silverlight)中,我们使用多个自定义附加属性来设置容器的所有子项中的属性值,通常是 GridStackPanel。我们更喜欢这种策略而不是样式和其他替代方案,因为我们可以在容器的同一个声明中使用更少的代码行。

我们有一个自定义附加属性,用于设置几个典型属性,例如容器所有子项的Margin 属性。我们遇到了其中一个问题,HorizontalAlignmentproperty。自定义附加属性与其他属性相同:

public class HorizontalAlignmentSetter
{
    public static readonly DependencyProperty HorizontalAlignmentProperty = DependencyProperty.RegisterAttached("HorizontalAlignment", typeof(HorizontalAlignment), typeof(HorizontalAlignmentSetter), new UIPropertyMetadata(HorizontalAlignment.Left, HorizontalAlignmentChanged));
    public static HorizontalAlignment GetHorizontalAlignment(DependencyObject obj) { return (HorizontalAlignment)obj.GetValue(HorizontalAlignmentProperty); }
    public static void SetHorizontalAlignment(DependencyObject obj, HorizontalAlignment value) { obj.SetValue(HorizontalAlignmentProperty, value); }

    private static void HorizontalAlignmentChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        var panel = sender as Panel;
        if (panel == null) return;
        panel.Loaded += PanelLoaded;
    }

    static void PanelLoaded(object sender, RoutedEventArgs e)
    {
        var panel = (Panel)sender;
        foreach (var child in panel.Children)
        {
            var fe = child as FrameworkElement;
            if (fe == null) continue;
            fe.HorizontalAlignment = GetHorizontalAlignment(panel);
        }
    }
}

XAML 中的用法也一样:

<Grid util:HorizontalAlignmentSetter.HorizontalAlignment="Left">
    <Label .../>
    <TextBox .../>
</Grid>

未调用附加属性,因此未在Grid 的子项中设置属性值。调试应用程序时,我们看到调用了静态属性声明 (public static readonly DependencyProperty HorizontalAlignmentProperty = DependencyProperty.RegisterAttached...),但没有调用其他代码,例如 SetHorizontalAlignment(DependencyObject obj... 和回调 private static void HorizontalAlignmentChanged(object sender,...

有什么想法吗?

【问题讨论】:

    标签: wpf wpf-4.0 attached-properties


    【解决方案1】:

    在 XAML 中,您将属性设置为默认值,这不会导致 PropertyChanged 处理程序触发。除非您从代码中调用样板 Get 和 Set 方法,否则永远不会调用它们,因为 XAML 中设置的属性直接调用 GetValueSetValue(与普通 DP 上的包装器属性一样)。

    为确保在设置值时始终调用更改处理程序,您可以改用 Nullable&lt;HorizontalAlignment&gt; 并将默认值设置为 null

    【讨论】:

      猜你喜欢
      • 2021-09-16
      • 2020-03-22
      • 1970-01-01
      • 2019-01-26
      • 2020-08-31
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      相关资源
      最近更新 更多