在应用程序范围内设置TextBox的FontFamily

时间:2013-10-24 07:56:06

标签: wpf xaml user-interface textbox font-family

我手边有一个大项目,涉及大量的视图和用户控件。另外,我想将每个元素的FontFamily设置为某种字体。

这适用于大多数用户控件,如textBlocks,按钮和标签。遗憾的是,这不适用于textBoxes。它们保持不变。

在创建整个GUI之前,我将覆盖包含文本的元素的大部分元数据:

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

经过一番搜索后,我发现本文使用的方法相同:http://blog.davidpadbury.com/

最后明确指出:

“在上面的图片中,你会看到我们已成功更改文本块,标签和按钮上的字体。不幸的是,TextBox中的字体保持不变,这是因为它从它的基础接收它的FontFamily属性class Control.Control将自身添加为TextElement FontFamilyProperty的所有者,但指定它自己的元数据,然后我们无法覆盖它。“

它还建议创建一个控件模板,然后设置fontFamily。还有另外一种方法吗?我想在开始时以编程方式设置fontFamily,而不使用XAML或创建controlTemplate并将其用作每个textBox的基本模板。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以在没有Style属性的情况下声明x:Key ,它将适用于该类型的所有控件:

<Style TargetType="{x:Type Control}">
    <Setter Property="FontFamily" Value="Calibri" />
</Style>

或者,您可以在MainWindow定义上设置此项,这将影响大多数元素:

<Window TextElement.FontFamily="Calibri" ...>
    ...
</Window>

啊......我刚刚注意到你使用xaml 的情况......对不起,我第一次看得更近了。


更新&gt;&gt;&gt;

经过一番研究后,您似乎可以在这样的代码中执行此操作:

Style style = new Style(typeof(TextBlock));
Setter setter = new Setter();
setter.Property = TextElement.FontFamilyProperty;
setter.Value = new FontFamily("Calibri");
style.Setters.Add(setter);
Resources.Add(typeof(TextBlock), style);

不幸的是,您还必须为其他类型的控件执行其他Style


更新2&gt;&gt;&gt;

我只想到了一些事情......之前的例子只是将Style设置为本地Resources部分,这将超出其他模块的范围。您可以尝试将Style设置为具有全局范围的Application.Resources部分。尝试将上面代码示例的最后一行替换为:

App.Current.Resources.Add(typeof(TextBlock), style);