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

chr*_*sva 10 wpf antialiasing wpf-controls

我目前正在Windows XP上编写WPF,其中抗锯齿呈现为blury文本.我们希望通过将TextOptions.TextFormattingMode设置为Display来对整个WPF应用程序进行消除锯齿.下面的代码解决了所有用户控件及其所有内容的问题,但不适用于我们从应用程序打开的窗口.我应该在TargetType中设置什么类型来覆盖应用程序中的所有Window和User Control元素?或者有更好的方法来做到这一点?

<Style TargetType="{x:Type ContentControl}">
     <Setter Property="TextOptions.TextFormattingMode" Value="Display"></Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

Cod*_*ked 10

该样式仅适用于ContentControl类型的控件,它不会应用于从ContentControl派生的类型(即Button,Window等).这就是隐式Styles的工作原理.

如果您将该Style放在Application.Resources中,那么它将应用于应用程序中的每个ContentControl,而不管控件所在的Window.如果您在特定Window的Resouces中定义它,那么它只会被应用到该窗口中的ContentControls.

TextOptions.TextFormattingMode属性是继承的,这意味着你只需要在视觉树的顶端设置它.所以这样的东西应该可以工作,如果放在Application.Resources中:

<Style TargetType="{x:Type Window}">
    <Setter Property="TextOptions.TextFormattingMode" Value="Display"></Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

编辑:

或者您可以通过覆盖默认值来将此应用于所有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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这篇文章中的样式实际上不起作用,因为ContentControl样式不起作用.样式中的Window类型需要是应用程序用于窗口的特定类.(它通常派生自Window.)此时,您也可以在XAML中为Window本身设置TextOptions属性,因为它只能在该类型上工作.理想情况下,会有一个解决方案将其应用于所有类型的窗口,以便它可以涵盖弹出窗口等等.还有什么想法? (2认同)