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继承吗?
答案 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程序员完全相同的操作。