【问题标题】:Setting FontFamily of TextBox applicationwide在应用程序范围内设置 TextBox 的 FontFamily
【发布时间】:2013-10-24 07:56:06
【问题描述】:

我手头有一个涉及大量视图和用户控件的大型项目。另外,我想将每个元素的 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 内的字体保持不变,这是因为它从它的基础接收了它的 FontFamily 属性类 Control。Control 将自己添加为 TextElement FontFamilyProperty 的所有者,但指定它自己的元数据,然后我们无法覆盖。"

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    您可以声明Style 不带x:Key 属性,它将应用于该类型的所有控件:

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

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


    更新 2 >>>

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

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

    【讨论】:

    • 遗憾的是,两者都不适合我。我以前是这样试过的。文本框仅使用 systemStandard 字体。使用 TextBox 作为 targetType 确实有效,但不是我想要的。我想根据系统语言以编程方式更改字体
    • 这很奇怪,因为我经常使用这个对我来说很好用的 XAML,并且我测试了这个对我来说也很好用的 C# 代码。
    • 正如我所说,该项目非常大,并且正在使用带有许多模块的 Prism。也许您的代码是正确的,而问题在于埋在其中一个模块内的其他地方。您的解决方案对我来说也很正确。但我不明白为什么 FontFamily 在这里被改变了。整个项目不包含 FontFamily 的任何变化,除了我的。无论如何,谢谢您,您帮助缩小了错误来源。我将不得不继续寻找或寻找工作场所。
    • 非常感谢,您的最新更新确实改变了一些文本框。遗憾的是有些没有。但这似乎与 Prism 和项目的结构有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多