Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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
C# 如何使附加属性对子集合更改作出反应?_C#_Wpf_Xaml - Fatal编程技术网

C# 如何使附加属性对子集合更改作出反应?

C# 如何使附加属性对子集合更改作出反应?,c#,wpf,xaml,C#,Wpf,Xaml,我有以下类定义附加属性以设置子级边距: public class MarginSetter { public static Thickness GetMargin(DependencyObject obj) { return (Thickness)obj.GetValue(MarginProperty); } public static void SetMargin(DependencyObject obj, Thickness value)

我有以下类定义附加属性以设置子级边距:

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);
    }

    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);
        }
    }
}
问题是,调用CreateThecknesForChildren时,尚未将任何子控件添加到父控件。如何修复该类,以便正确设置所有子控件的边距


在我的项目中,没有控件动态添加到父级,它们都是在xaml文件中创建的。顺便说一句,设计器工作正常,并且以某种方式为所有子元素正确设置了边距。

注册到面板的已加载事件如何?如果您以后动态添加项目,这将没有帮助,但对于基本的95%,这将起作用:

public static void CreateThicknesForChildren(object sender, DependencyPropertyChangedEventArgs e)
{
    var panel = sender as Panel;
    panel.Loaded += ...
}