Wpf 为什么OverrideMetadata没有响应?

Wpf 为什么OverrideMetadata没有响应?,wpf,metadata,dependency-properties,Wpf,Metadata,Dependency Properties,简单的问题。我将StackPanel子类化,如下所示。我正在尝试将Grid.IsSharedSizeScopeProperty的默认值更改为true,因为默认行为应该设置该值 如您所见,我尝试在静态初始值设定项中重写该属性,但它没有反映在UI中。但是,如果我改为在实例构造函数中显式设置它,它就可以工作了 我的问题是,为什么覆盖默认值不会影响布局,但它的显式设置会影响布局 这是我的XAML 正在尝试更改属性的默认值。这不管用 public class LabeledStackPanel : S

简单的问题。我将
StackPanel
子类化,如下所示。我正在尝试将
Grid.IsSharedSizeScopeProperty的默认值更改为
true
,因为默认行为应该设置该值

如您所见,我尝试在静态初始值设定项中重写该属性,但它没有反映在UI中。但是,如果我改为在实例构造函数中显式设置它,它就可以工作了

我的问题是,为什么覆盖默认值不会影响布局,但它的显式设置会影响布局

这是我的XAML


正在尝试更改属性的默认值。这不管用

public class LabeledStackPanel : StackPanel {

    static LabeledStackPanel(){

        Grid.IsSharedSizeScopeProperty.OverrideMetadata(
            typeof(LabeledStackPanel),
            new FrameworkPropertyMetadata(true));
    }
}
但是这样做(因此我知道属性本身会正确地影响布局):

具有讽刺意味的是,两者都不起作用!这件事真让我难堪!这就好像试图设置默认值以某种方式完全破坏了行为

public class LabeledStackPanel : StackPanel {

    static LabeledStackPanel(){

        Grid.IsSharedSizeScopeProperty.OverrideMetadata(
            typeof(LabeledStackPanel),
            new FrameworkPropertyMetadata(true));
    }

    public LabeledStackPanel(){
        Grid.SetIsSharedSizeScope(this, true);
    }
}
那么我在这里错过了什么

我猜这可能与以下评论有关(尽管这不是一个模板):

如果资源模板内的IsSharedSizeScope设置为true,并且在该模板外定义了SharedSizeGroup,则网格大小共享不起作用


作为记录,我还尝试使用
AddOwner
以这种方式重新定义属性,但事情是一样的。不起作用。

Grid.GetIsSharedSizeScope(此)
在LabeledItemGrid构造函数中为我返回
true
和OverrideMetadata。但子网格似乎不尊重它。您可以尝试添加子网格以查看它们是否如您所期望的那样响应吗?我可能会期望什么?也许可以编辑您的问题以添加有关用例的详细信息。使用示例XAML更新问题以显示我所指的内容。同样,如果我在构造函数中显式调用
Grid.SetIsSharedSizeScope(this,true)
,它会按预期工作,但重写元数据似乎不会影响控件。
Grid.GetIsSharedSizeScope(this)
在LabeledItemGrid中,构造函数使用OverrideMetadata为我返回
true
。但是子网格似乎不尊重它。您可以尝试添加子网格以查看它们是否如您所期望的那样响应吗?我可能会期望什么?也许可以编辑您的问题以添加有关用例的详细信息。使用示例XAML更新问题以显示我所指的内容。同样,如果我在构造函数中显式调用
Grid.SetIsSharedSizeScope(this,true)
,它会按预期工作,但重写元数据似乎不会影响控件。
public class LabeledStackPanel : StackPanel {

    static LabeledStackPanel(){

        Grid.IsSharedSizeScopeProperty.OverrideMetadata(
            typeof(LabeledStackPanel),
            new FrameworkPropertyMetadata(true));
    }

    public LabeledStackPanel(){
        Grid.SetIsSharedSizeScope(this, true);
    }
}