如何在运行时创建的wpf控件中覆盖应用程序样式

时间:2009-04-25 03:48:48

标签: wpf wpf-controls styles

我正在尝试在运行时创建一个WPF控件,但我无法弄清楚如何使它忽略来自App.xml资源的样式。我已经尝试将样式设置为null并将OverridesDefaultStyle设置为true但没有运气。应用程序设置将前景设置为白色,我似乎无法明确地将其设置为其他任何内容。

        Label tb = new Label();
        tb.OverridesDefaultStyle = true;
        tb.Style = null;
        tb.Foreground = new SolidColorBrush(Colors.Black);
        this.Children.Add(tb);

编辑:出于某种原因,我从来没有让Label工作,但是当我切换到文本框时,它工作正常。

感谢您的回复。

2 个答案:

答案 0 :(得分:1)

以下几乎相同的代码对我有用:

  Label l = new Label();
  l.Content = "Fie!!!";
  l.Style = null;
  l.OverridesDefaultStyle = true;  // not required, see below
  l.Foreground = new SolidColorBrush(Colors.Blue);
  ((Grid)Content).Children.Add(l);

然而,从实验开始,如果在设置样式后设置OverridesDefaultStyle = true ,它似乎没问题。但是如果在设置Style之前设置OverridesDefaultStyle ,那一切都会出错。 (不,我不知道为什么会发生这种情况! grin )所以将OverridesDefaultStyle设置器移到Style setter之后,或者(因为它不是你想要的效果所必需的),只需删除它。 / p>

答案 1 :(得分:1)

您只需将Style设置为null即可停止继承。然后,您可以将Foreground设置为您喜欢的任何内容:

var tb = new TextBlock() { Text = "Hello" };
tb.Style = null;
tb.Foreground = Brushes.Blue;
this.Children.Add(tb);

如果这不适合你,我会建议其他事情继续发生。

PS。使用Brushes.Black而不是创建自己的SolidColorBrush。它不仅更干净,而且刷子也会被冷冻。您的代码会创建一个未冻结的画笔,效率较低。您也可以通过在画笔上调用Freeze()来自行冻结。