WPF DependencyProperty继承-常规DP与附加

时间:2018-10-11 00:14:39

标签: c# wpf

1)对于“字体”,依赖项属性继承是开箱即用的。 https://wpf.2000things.com/2014/03/31/1040-an-example-of-dependency-property-inheritance/

您可以在主窗口上更改“字体”,它会向下传播到用户控件中(任何子用户控件中的无更改,该功能都可以使用)。

2)如果您想使DP继承适用于您自己的DP,则您的DP必须为“附加属性” ,并且您可以通过
一种。 FrameworkPropertyMetadataOptions.Inherits
b。从类订阅到属性继承:MyClass.InheritedValueProperty。 AddOwner

http://devcomponents.com/blog/?p=495

“开箱即用”的DP如何使DP继承开箱即用,而如果您希望自己的DP继承能够正常工作,那么会有很多限制(您的DP必须是“附加属性”,实施(在任何订阅它的类中都有很多样板代码)?

对于“开箱即用”的WPF实现,我假设框架基类“ DependencyObject” 中的那些样板代码?此外,“字体”是在框架基类“控件” 中定义的DP(即使MainWindow是控件)-
 https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.control?view=netframework-4.7.2
https://docs.microsoft.com/en-us/dotnet/api/system.windows.window?view=netframework-4.7.2

WPF DepdendencyObject必须为诸如字体之类的现成DP实现现成DP继承吗?

1 个答案:

答案 0 :(得分:0)

您的描述正是为现成的WPF属性(例如FontFamily)实现的。 FontFamily被声明为TextElement类的附加属性...

public abstract class TextElement : FrameworkContentElement, IAddChild
{

    …

    /// <summary>
    /// DependencyProperty for <see cref="FontFamily" /> property.
    /// </summary>
    [CommonDependencyProperty]
    public static readonly DependencyProperty FontFamilyProperty =
        DependencyProperty.RegisterAttached(
            "FontFamily",
            typeof(FontFamily),
            typeof(TextElement),
            new FrameworkPropertyMetadata(
                SystemFonts.MessageFontFamily,
                FrameworkPropertyMetadataOptions.AffectsMeasure |                 
                FrameworkPropertyMetadataOptions.AffectsRender | 
                FrameworkPropertyMetadataOptions.Inherits),
                new ValidateValueCallback(IsValidFontFamily));

...,然后在Control类中将其添加为所有者...

public class Control : FrameworkElement
{
    …

    /// <summary>
    ///     The DependencyProperty for the FontFamily property.
    ///     Flags:              Can be used in style rules
    ///     Default Value:      System Dialog Font
    /// </summary>
    [CommonDependencyProperty]
    public static readonly DependencyProperty FontFamilyProperty =
            TextElement.FontFamilyProperty.AddOwner(
                    typeof(Control),
                    new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily,
                        FrameworkPropertyMetadataOptions.Inherits));

您必须执行与WPF程序员完全相同的操作。