Wpf,样式未应用

Spo*_*ook 4 c# wpf xaml

我用弹出窗口编写了一个用户控件,其内容正在控件之外设置.该控件的ControlTemplate如下所示:

<ControlTemplate TargetType="local:InfoIcon">
    <Grid>
        <ToggleButton x:Name="HelpButton" Style="{StaticResource HelpButton}" />
        <Popup PlacementTarget="{Binding ElementName=HelpButton}" Placement="Bottom"
                IsOpen="{Binding ElementName=HelpButton, Path=IsChecked, Mode=TwoWay}" StaysOpen="False">
            <Border BorderBrush="#767676" BorderThickness="1" 
                    Background="#f1f2f7">
                <Border.Resources>

                    <!-- Important -->
                    <Style TargetType="Label">
                        <Setter Property="Foreground" Value="#575757" />
                    </Style>
                    <Style TargetType="TextBlock">
                        <Setter Property="Foreground" Value="#575757" />
                    </Style>
                    <!-- /Important -->

                </Border.Resources>
                <ContentPresenter Content="{TemplateBinding HelpContent}" />
            </Border>
        </Popup>                                   
    </Grid>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

Important部分-我想指定自定义样式的项目,目前正在投放弹出里面(它作为一个可点击的提示)

我通过以下方式使用我的控件:

<local:MyControl>
    <local:MyControl.HelpContent>
        <TextBlock>Ala ma kota</TextBlock>
    </local:MyControl.HelpContent>
</local:MyControl>
Run Code Online (Sandbox Code Playgroud)

但是,尽管边框中的样式,TextBlock文本的颜色总是继承其父级的值(使用Snoop检查) - 导致白色背景上的白色文本.

您可以使用小型PoC应用程序,这可以解决问题.

我的观察:

  • 造型确实有效Label.它只是不起作用TextBlock.
  • 当我添加TextBlock.Foreground="Red"到边框时,TextBlock变为红色,仍然忽略样式(但现在使用边框中的颜色).
  • 史努比通知,这TextBlock实际上已经Style解决正确.但是尽管它不应该,它使用继承的值而不是样式中指定的值.

我该如何解决这个问题?为什么会出现这个问题?

Spo*_*ook 6

我在微软论坛上收到了回复; 我会把它留在这里以防有人遇到同样的问题.

不同之处在于TextBlock不是一个控件,即它没有任何ControlTemplate,因此当它位于StackPanel内部时,隐式样式不会应用于它.有关更多信息,请参阅以下页面:http: //blogs.msdn.com/b/wpfsdk/archive/2009/08/27/implicit-styles-templates-controls-and-frameworkelements.aspx

您可以使用Label元素或显式设置TextBlock元素的样式.

- 马格努斯(MM8)