WPF覆盖元数据前景依赖属性

时间:2013-01-03 15:30:01

标签: wpf

我希望有人可以解决我的问题,因为我到处搜索,无法找到解释或解决方法。

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

创建一个新的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中创建这个新Label类的实例: -

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

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

据我所知,任何依赖属性都可以被覆盖,所以任何帮助都会非常感激!

2 个答案:

答案 0 :(得分: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继承了价值的优势!

编辑:here一些不错的信息。

答案 1 :(得分:2)

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

这对我有用。