WPF:在 TextBlock 上设置默认样式会覆盖 Label 的样式

8

将TextBlock的默认样式设置为样式,会导致Label和其他控件的样式也被设置。只有当您将样式放在应用程序资源中时才会发生这种情况,当我将样式放在窗口资源中时一切正常。

我还发现,VS 2008设计器和XamlPadX显示的标签与预期相符,但只有在实际运行应用程序时才会出现问题。

<Application x:Class="WpfApplication.App"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   StartupUri="Window1.xaml">
   <Application.Resources>
       <ResourceDictionary>
           <Style TargetType="TextBlock">
               <Setter Property="FontSize" Value="8"/>
           </Style>

           <Style x:Key="Title" TargetType="Label">
               <Setter Property="FontSize" Value="32"/>
           </Style>
       </ResourceDictionary>
   </Application.Resources>
</Application>

<Window x:Class="WpfApplication.Window1"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Height="300"
       Title="Window1"
       Width="300">
   <StackPanel>

       <TextBlock Text="TextBlock No Style" Style="{x:Null}"/>
       <Label Content="Label No Style" Style="{x:Null}"/>

       <TextBlock Text="Default TextBlock"/>
       <Label Content="Default Label" Style="{StaticResource Title}"/>

   </StackPanel>
</Window>

上面的代码显示:
TextBlock No Style - Default font size (As you would expect)
Label No Style - Size 5 font size (How did this happen?)
Default TextBlock - Size 5 font size (As expected by my style)
Default Label - Size 5 font size (How did this happen?)
2个回答

11

是的,这是可以预料的;看一下 Label 的默认模板,它只是一个缩进的 TextBlock。样式是继承的,所以 Label 会将字体大小设置为32,但是然后 TextBlock 的样式会覆盖它。如果你只有<TextBlock>标签,那么它也会是5pt。

编辑: 所以我解决这个问题的方法是创建一个名为 NormalText 的 TextBlock 子类(即不改变任何内容的类),然后对其进行样式设置;这样您就不会意外选择其他 TextBlocks。


0

另外,您可以尝试更改标签的内容,例如:

  <Label>
             <Label.Content> 
                 <TextBlock 
                  Text="{Binding Content}"    
                  FontSize="30"></TextBlock> 
             </Label.Content>
   </Label> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接