【问题标题】:TextBox set default fontTextBox 设置默认字体
【发布时间】:2016-04-04 12:56:02
【问题描述】:

如何为TextBox 设置默认字体?

对于TextBlock,它是(取自here):

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

尝试对TextBox 做同样的事情:

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

将抛出:

抛出异常:PresentationFramework.dll 中的“System.Windows.Markup.XamlParseException”

附加信息:“System.Windows.Controls.TextBox”的类型初始化程序引发了异常。 PropertyMetadata 已为“TextBox”类型注册。


这里是重现:

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

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


智能感知显示:

【问题讨论】:

  • 为一种框架类型(例如 TextBlock)调用 OverrideMetadata 无论如何都是可疑的。您应该通过样式设置默认值。
  • 我尝试设置TextElement 它对任何事情都不起作用。设置TextBlock 一个有效,但仅适用于TextBlock
  • 你试过OverrideMetadata(Type, PropertyMetadata, DependencyPropertyKey)版本和DependencyPropertyKey
  • @bars222,不明白你的意思。你能写出一整行代码吗?
  • @Clemens,如何设置适用于(TextBoxTextBlock)相同字体的样式?请参阅@Kiel's answer,它有效,但仅适用于一个(绝不适用于两者)。他们有FrameworkElement 基类,但它不包含FontFamilyProperty

标签: c# wpf fonts textbox code-behind


【解决方案1】:

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

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

【讨论】:

  • VS15 建议使用Control. ... typeof(TextBoxBase)。奇怪的是,组合有效(我更喜欢它而不是 app.xaml 解决方案),非常感谢,我永远不会猜到自己。
  • 不客气。感谢您在应用程序中更改字体的方式(有用的问题)。
【解决方案2】:

对于您的整个应用程序,您可以在 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>

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

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

或者,如果它是“UserControl”,请将“Window”替换为“UserControl”——你懂的。

您的基本格式如下所示:

<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>

祝你好运!

【讨论】:

  • 我有 20 个窗口和 50 个用户控件,最好在一个地方设置默认值。您的示例适用于TextBlockTextBox 字体样式仍为“Segoe”)。我可以将TargetType 更改为TextBox,然后它只适用于TextBox。设置两者似乎只将样式应用于第一个定义的样式。好笑。
  • @Sinatr - 你可以在 App.xaml 中全局设置它。
  • 另外,针对 TextBlock 的 FontSize 也会影响按钮(在运行时,而不是在 Studio 中)...?!?
【解决方案3】:

我的问题不是单独设置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")));

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2011-10-12
    • 2012-09-14
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多