WPF DependencyProperty Inheritance - обычный DP против присоединенного - PullRequest
0 голосов
/ 11 октября 2018

1) Для "шрифта" наследование свойства зависимости будет работать "из коробки".https://wpf.2000things.com/2014/03/31/1040-an-example-of-dependency-property-inheritance/

Вы можете изменить «Шрифт» в главном окне, оно будет распространяться вниз по пользовательским элементам управления ( без изменений в любых дочерних пользовательских элементах управления, чтобы это работало).

2) Если вы хотите, чтобы наследование DP работало для ваших собственных DP, ваши DP должны быть «Attached Properties» , и вы делаете это с помощью
a. FrameworkPropertyMetadataOptions.Inherits
b.От подписки класса к наследованию свойства: MyClass.InheritedValueProperty. AddOwner

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

Как получаются "из коробки" DP получают наследование DP изв то время как если вы хотите, чтобы ваше собственное наследование DP работало, существует очень много ограничений (ваш DP должен быть «Attached Properties», вещи для реализации (так много шаблонного кода в любом классе, подписывающемся на него)?

Для "готовой" реализации WPF, я предполагаю, что этот шаблонный код в базовом классе платформы "DependencyObject" ? Далее, "Шрифт" - это DP, определенный в базовом классе платформы "Control " (Even MainWindow - это Control) -
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-box, такие как Font?

1 Ответ

0 голосов
/ 11 октября 2018

Ваше описание точно так, как оно реализовано для готовых свойств WPF, таких как FontFamily.FontFamily объявляется как присоединенное свойство в TextElement class ...

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 class он добавляется каквладелец ...

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...