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 。