TextBox设置默认字体

时间:2016-04-04 12:56:02

标签: c# wpf fonts textbox code-behind

如何设置TextBox的默认字体?

对于TextBlock它(取自here):

TextBlock.FontFamilyProperty.OverrideMetadata(typeof(TextBlock),
    new FrameworkPropertyMetadata(new FontFamily("Verdana")));

尝试对TextBox执行相同操作:

TextBox.FontFamilyProperty.OverrideMetadata(typeof(TextBox),
    new FrameworkPropertyMetadata(new FontFamily("Verdana")));

将抛出:

  

抛出异常:' System.Windows.Markup.XamlParseException'在PresentationFramework.dll

中      

附加信息:System.Windows.Controls.TextBox'的类型初始值设定项。抛出一个例外。 PropertyMetadata已经注册了类型' TextBox'。

这是repro:

<StackPanel>
    <TextBlock Text="123123" />
    <TextBox Text="123123" BorderThickness="0" Padding="-2,0,-2,0" />
</StackPanel>

在窗口构造函数(TextBlock之前)中设置InitializeComponent()字体如上所述。如何设置TextBox默认字体(默认为我的Segoe)?我需要一个解决方案,在一个地方将"Verdana"设置为整个应用程序。

智能感知显示:

TextBlock

TextBox

3 个答案:

答案 0 :(得分:2)

您可以将TextBox更改为TextBoxBase。不知何故,它对我有用。

TextBoxBase.FontFamilyProperty.OverrideMetadata( typeof( TextBoxBase ),
                new FrameworkPropertyMetadata( new FontFamily( "Verdana" ) ) );

答案 1 :(得分:1)

对于整个应用程序,您可以在App.xaml中设置它:

<Application.Resources>
    <Style TargetType="TextBox">
        <Setter Property="FontFamily" Value="Verdana" />
        <Setter Property="FontSize" Value="50"></Setter>
    </Style>

    <Style TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Verdana" />
        <Setter Property="FontSize" Value="100"></Setter>
    </Style>
</Application.Resources>

对于单个文件,您可以在Window或UserResource开启标记后的XAML中设置:

<Window.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Verdana" />
    </Style>
</Window.Resources>

如果它是&#39; UserControl&#39;,请替换“&#39; Window&#39;使用&#39; UserControl&#39; - 你明白了。

您的基本格式如下:

<Window x:Class="WpfApplicationTestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
    <Style TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Verdana" />
    </Style>
</Window.Resources>

    <Grid>
        <StackPanel>
            <TextBlock Text="123123" />
            <TextBox Text="123123" BorderThickness="0" Padding="-2,0,-2,0" />
        </StackPanel>
    </Grid>
</Window>
祝你好运!

答案 2 :(得分:0)

我的问题不是单独设置TextBox样式(抱歉有误导性),而是将其与TextBlock一起设置。

问题似乎与那些控件没有共同基类来继承FontFamilyProperty有关。 TextBoxTextBoxBaseTextBlock中获取一个。尝试在窗口(窗口)或窗口xaml后面的任何一个代码中设置两者都会导致异常或者没有异常(两者都不会工作)。

技巧是将它设置在应用程序资源中,不要问我原因,但它可以正常工作(并适用于所有内容):

<Application.Resources>
    <Style TargetType="TextBox">
        <Setter Property="FontFamily" Value="Verdana" />
    </Style>
    <Style TargetType="TextBlock">
        <Setter Property="FontFamily" Value="Verdana" />
    </Style>
    <!-- not sure if this make sense -->
    <Style TargetType="TextElement">
        <Setter Property="FontFamily" Value="Verdana" />
    </Style>
</Application.Resources>

以下也有效(感谢@bars222's answer):

// font overrides
TextElement.FontFamilyProperty.OverrideMetadata(typeof(TextElement),
    new FrameworkPropertyMetadata(new FontFamily("Verdana")));
TextBlock.FontFamilyProperty.OverrideMetadata(typeof(TextBlock),
    new FrameworkPropertyMetadata(new FontFamily("Verdana")));
Control.FontFamilyProperty.OverrideMetadata(typeof(TextBoxBase),
    new FrameworkPropertyMetadata(new FontFamily("Verdana")));