2

我希望有人能对我的问题有所了解,因为我到处搜索并且找不到对此的解释或解决方案。

为了解释这个问题,我创建了一个名为 Label 的类,它继承自 TextBlock,我想覆盖默认的前景画笔、字体粗细、字体大小和字体系列;除了前景之外,所有覆盖都起作用(我可以毫无问题地覆盖背景,因此它是特定于前景属性的东西)。

创建一个新的 WPF 应用程序并创建这个简单的类:-

namespace WpfApplication
{
    public class Label : TextBlock
    {
        static Label()
        {
            ForegroundProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(Brushes.Red));
            FontWeightProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(FontWeights.Bold));
            FontSizeProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(50.0));
            FontFamilyProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(new FontFamily("Calibri")));
        }
    }
}

在 MainWindow.xaml 中创建这个新标签类的实例:-

<Grid>
    <local:Label Text="TEST" />
</Grid>

您应该看到 Label 没有采用新的 Foreground 默认值,但在 SNOOP 中查看它仍然继承它的值。

据我所知,任何依赖属性都可以被覆盖,所以任何帮助都将不胜感激!

4

2 回答 2

5
ForegroundProperty.OverrideMetadata(typeof(LcdTextBlock), new FrameworkPropertyMetadata(new SolidColorBrush(Colors.Lime)) { Inherits = false });

这对我有用。

于 2014-05-06T19:02:55.417 回答
2

一种解决方法是:

public class Label : TextBlock
    {
        static Label()
        {
            ForegroundProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(Brushes.Red, OnForegroundChanged));
            FontWeightProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(FontWeights.Bold));
            FontSizeProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(50.0));
            FontFamilyProperty.OverrideMetadata(typeof(Label), new FrameworkPropertyMetadata(new FontFamily("Calibri")));
        }

        private static void OnForegroundChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {

        MethodInfo mi = typeof(DependencyPropertyChangedEventArgs).GetMethod("get_OperationType",
                                                                              BindingFlags.NonPublic |
                                                                              BindingFlags.Instance);
        var v = mi.Invoke(e, null);

        if ((e.NewValue != Brushes.Red) && (v.ToString() == "Inherit"))
        {
            ((Label)d).Foreground = Brushes.Red;
        }
        else
        {
            ((Label)d).Foreground = (Brush)e.NewValue;
        }
    }
}

在设计视图中的 VisualStudio 2012 上,您的代码预览以红色显示文本。有些东西在运行时改变它。但目前我不能告诉你是谁和为什么...... dafault继承价值盛行!

编辑:这里有一些很好的信息。

于 2013-01-03T15:50:45.263 回答