Wpf,样式未应用
我用弹出窗口编写了一个用户控件,其内容正在控件之外设置。 该控件的ControlTemplate如下所示:
Important
部分 – 我想为项目分配自定义样式,这些项目被放在弹出窗口中(它用作可点击的提示)
我通过以下方式使用我的控件:
Ala ma kota
但是尽管边框中有样式, TextBlock
的文本颜色总是从其父级inheritance值(使用Snoop检查) – 在白色背景上产生白色文本。
您可以使用小型PoC应用程序,这可以解决问题 。
我的观察:
- 样式确实适用于
Label
。 它仅适用于TextBlock
。 - 当我将
TextBlock.Foreground="Red"
添加到Border时,TextBlock
变为红色,仍然忽略样式(但现在使用Border中的颜色)。 - Snoop通知说,这个
TextBlock
实际上已正确解析了Style
。 但是尽管它不应该 ,它使用inheritance的值而不是样式中指定的值。
我该如何解决这个问题?为什么会出现这个问题?
我在微软论坛上收到了回复; 如果有人遇到同样的问题,我会留在这里。
区别在于TextBlock不是一个控件,即它没有任何ControlTemplate,因此当它位于StackPanel内部时,隐式样式不会应用于它。 有关更多信息,请参阅以下页面: http : //blogs.msdn.com/b/wpfsdk/archive/2009/08/27/implicit-styles-templates-controls-and-frameworkelements.aspx
您可以使用Label元素或显式设置TextBlock元素的样式。
– 马格努斯(MM8)
EDIT2
我已将UserControl
的前景设置为其他内容。 此行为是因为UserControl的子TextBlock
控件以某种方式inheritanceForeground-Settings。 这与弹出窗口或我们尝试的其他方法无关。
我在这里遇到了类似问题的另一个问题: 无法覆盖wpf中的控件前景色
我建议接受这种奇怪的行为,只需设置UserControl的Foreground
颜色:
上一个编辑
你对这种奇怪的行为感到好奇,但看了你的PoC之后就很明显了:) Popup有一些附加的属性TextElement.*
你可以在弹出窗口中设置文本元素的样式。 这对我来说也是新的,之后我会再研究一下。 尽管如此:您的问题的解决方法是不设置TextBlock
样式,而是设置Popup
。 您的代码可能如下所示:
我将样式更改为控件之外,当然您可以直接使用弹出窗口的附加属性。 但是最初你想知道它如何与边框上附加的样式一起使用,现在添加样式的位置并不重要。 例如,您可以使用ResourceDictionary。
作为建议,不应该这样:
TargetType="local:InfoIcon"
是这样的?
TargetType="{x:Type local:InfoIcon}"
也许你有一些TextBlock样式定义它应该采用父控件的前景。
您是否尝试添加这样的BasedOn属性?
我试过你的代码示例,这有效:
这有点奇怪,因为当我在ContentPresenter.Style中放置Label控件的Foreground setter时,这次它的Label不起作用……我认为这是因为Label被认为是ContentControl而TextBlock只是一个FrameworkElement 。