我用FrameworkPropertyMetadataOptions.Inherits
声明了一个依赖属性:
public static class DesignerItemStyles {
public static readonly DependencyProperty HeaderBackgroundProperty =
DependencyProperty.RegisterAttached(
"HeaderBackground", typeof(Brush), typeof(DesignerItemStyles),
new FrameworkPropertyMetadata(
Brushes.DesignerViewElementHeaderBackground,
FrameworkPropertyMetadataOptions.Inherits));
/* Below are Get & Set as usual */
}
它有点工作,但不知何故不是整个视觉树。以下是显示从ContentPresenter
继承价值的HeaderedDesignerItemChrome
的屏幕截图:
现在,屏幕截图显示ContentPresenter
的内容,并且不会继承该值。它也没有被设置为其他东西 - 它是默认值:
知道为什么吗?
答案 0 :(得分:7)
使用它并不是那么简单,因为有一些规则需要遵循以实现具有可继承值的属性。他们在这里:
在父级上,依赖属性必须定义为附加属性。您仍然可以声明属性getter / setter,但必须附加属性。这是一个简单的声明:
public static readonly DependencyProperty InheritedValueProperty =
DependencyProperty.RegisterAttached("InheritedValue",
typeof(int), typeof(MyClass), new FrameworkPropertyMetadata(0,
FrameworkPropertyMetadataOptions.Inherits));
public static int GetInheritedValue(DependencyObject target)
{
return (int)target.GetValue(InheritedValueProperty);
}
public static void SetInheritedValue(DependencyObject target, int value)
{
target.SetValue(InheritedValueProperty, value);
}
public int InheritedValue
{
get
{
return GetTimeSlotDuration(this);
}
set
{
SetTimeSlotDuration(this, value);
}
}
子对象将使用AddOwner定义具有继承值的属性实例。以下是MyChildClass示例类的代码:
public static readonly DependencyProperty InheritedValueProperty;
public int InheritedValue
{
get
{
return (int)GetValue(InheritedValueProperty);
}
set
{
SetValue(InheritedValueProperty, value);
}
}
static MyChildClass()
{
InheritedValueProperty =
MyClass.InheritedValueProperty.AddOwner(typeof(MyChildClass),
new FrameworkPropertyMetadata(0,
FrameworkPropertyMetadataOptions.Inherits));
}
如果使用单个参数重载,则保留全局默认值并且继承仍然有效...
MyClass.InheritedValueProperty.AddOwner(typeof(MyChildClass));
请注意,属性在子类中声明为标准依赖项属性,并且它在元数据选项中指定Inherit。
现在,当MyChildClass以可视方式或逻辑方式成为MyClass的父级时,它们会自动共享相同的属性值。
从技术上讲,你在Visual Tree中看到的就是做你告诉它做的事情。它设置了您告诉它的默认值,并且继承的控件继承自您的ContentPresenter的父级值
答案 1 :(得分:0)
消除两个ContentPresenters中的一个(在DesignerItemsPresenter上方的两个屏幕截图中都可见)为我工作。我倾向于认为这是WPF框架本身的一个错误。