0

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

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

在创建整个 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 内的字体保持不变,这是因为它从其基类 Control 接收了 FontFamily 属性。控件将自己添加为 TextElement FontFamilyProperty 的所有者,但指定它自己的元数据,然后我们无法覆盖。”

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

提前致谢。

4

1 回答 1

2

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

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

或者,您可以简单地在MainWindow将影响大多数元素的定义上设置它:

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

啊...我刚刚注意到您使用 xaml 的情况...对不起,我第一次应该仔细看看。


更新>>>

经过一番研究,您似乎可以在如下代码中执行此操作:

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

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

App.Current.Resources.Add(typeof(TextBlock), style);
于 2013-10-24T08:14:01.920 回答