当前位置 : 主页 > 手机开发 > 其它 >

wpf – 不继承依赖属性值

来源:互联网 收集:自由互联 发布时间:2021-06-19
我用FrameworkPropertyMetadataOptions.Inherits声明了一个依赖属性: public static class DesignerItemStyles { public static readonly DependencyProperty HeaderBackgroundProperty = DependencyProperty.RegisterAttached( "HeaderBackgrou
我用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 */
}

它有点工作,但不知何故不是整个视觉树.以下是显示从HeaderedDesignerItemChrome继承值的ContentPresenter的屏幕截图:

现在,屏幕截图显示ContentPresenter的内容,并且它不会继承该值.它也没有被设置为其他东西 – 它是默认值:

知道为什么吗?

使用它并不是那么简单,因为有一些规则需要遵循以实现具有可继承值的属性.他们来了:

在父级上,依赖属性必须定义为附加属性.您仍然可以声明属性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的父值

网友评论