WPF - 如何为应用程序中的所有控件启用TextFormattingMode="Display"?

10

我目前正在Windows XP上编写WPF,其中抗锯齿呈模糊文本形式呈现。我们希望通过设置TextOptions.TextFormattingMode为Display来对整个WPF应用程序进行抗锯齿处理。下面的代码解决了所有用户控件及其内容的问题,但不适用于从应用程序中打开的窗口。在TargetType中应设置哪种类型以覆盖应用程序中的所有窗口和用户控件元素?或者有更好的方法来实现这一点吗?

<Style TargetType="{x:Type ContentControl}">
     <Setter Property="TextOptions.TextFormattingMode" Value="Display"></Setter>
</Style>
1个回答

11

这种样式只适用于类型为ContentControl的控件,不适用于从ContentControl派生的类型(例如Button、Window等)。这就是隐式样式的工作原理。

如果您将该样式放在Application.Resources中,则会应用于应用程序中的每个ContentControl,无论该控件位于哪个窗口中。如果您将其定义在特定窗口的资源中,则仅适用于该窗口中的ContentControls。

TextOptions.TextFormattingMode属性是继承的,这意味着您只需要在可视树的顶部设置它。因此,如果将此内容放置在Application.Resources中,则可以正常工作:

<Style TargetType="{x:Type Window}">
    <Setter Property="TextOptions.TextFormattingMode" Value="Display"></Setter>
</Style>

编辑:

或者你可以通过覆盖默认值来将其应用于所有Windows,甚至是派生类型,如下所示:

using System.Windows;
using System.Windows.Media;

namespace MyProject
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application {
        static App() {
            TextOptions.TextFormattingModeProperty.OverrideMetadata(typeof(Window),
                new FrameworkPropertyMetadata(TextFormattingMode.Display, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.Inherits));
        }
    }
}

2
这篇文章中的样式实际上之所以不起作用,与ContentControl样式不起作用的原因相同。样式中的Window类型需要是应用程序用于窗口的特定类(通常派生自Window)。此时,您可能会在XAML中为窗口本身设置TextOptions属性,因为它只能在该类型上工作。理想情况下,将有一种解决方案,可以将其应用于所有窗口,而不管类型,以便可以覆盖诸如弹出窗口之类的内容。还有其他想法吗? - MrSlippers
@MrSlippers - 很好的观点,我用另一种选择更新了我的答案。 - CodeNaked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接