Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF附加属性不适用于在子元素中设置水平对齐_Wpf_Wpf 4.0_Attached Properties - Fatal编程技术网

WPF附加属性不适用于在子元素中设置水平对齐

WPF附加属性不适用于在子元素中设置水平对齐,wpf,wpf-4.0,attached-properties,Wpf,Wpf 4.0,Attached Properties,在我们的WPF 4.0项目(不是Silverlight)中,我们使用几个自定义的附加属性来设置容器所有子容器中的属性值,通常是网格或堆栈面板。与样式和其他替代方案相比,我们更喜欢这种策略,因为我们可以在容器的同一声明中使用更少的代码行 我们有一个自定义的附加属性,用于设置几个典型属性,例如容器所有子级的Margin属性。其中一个属性HorizontalAlignment出现问题。自定义附加属性与其他属性相同: public class HorizontalAlignmentSetter {

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

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

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>

不会调用附加属性,因此不会在
网格的子级中设置属性值。调试应用程序时,我们会看到调用静态属性声明(
public static readonly dependencProperty HorizontalAlignmentProperty=dependencProperty.RegisterAttached…
),但不会调用其他代码,如
SetHorizontalAlignment(DependencyObject obj…
因此回调
私有静态void HorizontalAlignment已更改(对象发送方…


有什么想法吗?

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


为了确保在设置值时始终调用更改处理程序,您可以使用
null
,并在XAML中将默认值设置为
null
,您将属性设置为默认值,这将不会导致触发
PropertyChanged
处理程序。永远不会调用样板文件Get和set方法除非您从代码中调用它们,否则将被禁用,因为XAML中设置的属性直接调用
GetValue
SetValue
(与普通DP上的包装器属性一样)

为了确保在设置值时始终调用更改处理程序,您可以使用
null
,并将默认值设置为
null