按风格的WPF更改按钮的fontSize失败?

时间:2010-11-26 10:38:04

标签: wpf styles

我有我的文件Styles.xaml,它们在Application.xaml中合并,所以它适用于所有东西..

这是我的风格

<Style TargetType="{x:Type Control}" x:Key="baseStyle">
    <Setter Property="FontFamily" Value="Verdana"/>
    <Setter Property="FontSize" Value="12"/>
</Style>

<Style TargetType="Button" BasedOn="{StaticResource baseStyle}">
    <Setter Property="Margin" Value="2,0,2,0"/>
    <Setter Property="Padding" Value="2"/>
    <Setter Property="FontSize" Value="50"/>
</Style>

<Style TargetType="TextBlock">
    <Setter Property="FontFamily" Value="Verdana"/>
    <Setter Property="FontSize" Value="12"/>
</Style>

当我在编辑器中这似乎有效但是当我运行应用程序时,按钮的字体大小会缩小到正常大小。

我的猜测是,当按钮的内容设置为字符串然后使用文本块样式时,按钮会创建一个TextBlock ..但是如何覆盖它呢?

2 个答案:

答案 0 :(得分:8)

你是对的

  

我的猜测是按钮创建了一个   TextBlock的内容设置为   一个字符串,然后使用文本块   式

。请参阅this帖子。

  

解决方法是定义一个   DataTemplate for System.String,其中   我们可以明确使用默认值   TextBlock显示内容。您   可以将DataTemplate放在   你定义的相同词典   TextBlock风格使这一点   DataTemplate将应用于   无论ContentPresenter受到什么影响   你的风格。

因此,最后将DataTemplate添加到Styles.xaml将解决问题

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <Style TargetType="{x:Type Control}" x:Key="baseStyle">
        <Setter Property="FontFamily" Value="Verdana"/>
        <Setter Property="FontSize" Value="12"/>
    </Style>

    <Style TargetType="{x:Type Button}" BasedOn="{StaticResource baseStyle}">
        <Setter Property="Margin" Value="2,0,2,0"/>
        <Setter Property="Padding" Value="2"/>
        <Setter Property="Foreground" Value="Red" />
        <Setter Property="FontSize" Value="50"/>
    </Style>

    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="FontFamily" Value="Verdana"/>
        <Setter Property="Foreground" Value="Green" />
        <Setter Property="FontSize" Value="24"/>
    </Style>

    <DataTemplate DataType="{x:Type sys:String}">
        <TextBlock Text="{Binding}">
            <TextBlock.Resources>
                <Style TargetType="{x:Type TextBlock}"/>
            </TextBlock.Resources>
        </TextBlock>
    </DataTemplate>
</ResourceDictionary>

这将保留TextBlock的Style,但是例如在Button中创建的TextBlock不会受其影响

答案 1 :(得分:0)

我试过你的风格,效果很好。所以你的风格不是问题。我认为这是你在写作时合并风格的地方。您最好将ResourceDictionary Styles.xaml放在MainWindow文件中而不是Application.xaml中。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

    <StackPanel>
        <TextBlock>TTT</TextBlock>
        <Button>BBB</Button>
    </StackPanel>
</Window>

但是您的问题仍然不清楚,如果不是解决方案,您可以通过发布这部分代码来更清楚地说明您使用样式的方式吗?