我希望有人可以解决我的问题,因为我到处搜索,无法找到解释或解决方法。
为了解释这个问题,我创建了一个名为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中它仍然继承它的值。
据我所知,任何依赖属性都可以被覆盖,所以任何帮助都会非常感激!
答案 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 });
这对我有用。