【问题标题】:How can you change the highlighted text color for a WPF TextBox?如何更改 WPF 文本框的突出显示文本颜色?
【发布时间】:2010-09-29 04:34:00
【问题描述】:

WPF TextBox 原生使用系统高亮颜色来绘制选定文本的背景。我想覆盖它并使其保持一致,因为它因操作系统/用户主题而异。

对于ListBoxItems,有一个neat trick(见下文),您可以在其中覆盖HighlightBrushKey 的资源键以在焦点设置中自定义系统突出显示颜色:

<Style TargetType="ListBoxItem">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                         Color="LightGreen"/>
    </Style.Resources>
</Style>

不幸的是,同样的技巧不适用于TextBox。除了“覆盖ControlTemplate”之外,还有其他人有什么想法吗?

NOTE: This behavior appears to be added to WPF 4.

【问题讨论】:

    标签: wpf textbox resources styles highlight


    【解决方案1】:

    您可以为 TextBox 创建一个 Style 并为背景编写一个 Setter。 TextBox 样式应该是默认样式,以便可视化树下的任何 TextBox 都将获得更改后的 TextBox

    <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
    

    【讨论】:

    • 这会改变整个文本框的背景颜色,我正在寻找的是如何只改变突出部分的背景。不过还是谢谢。
    【解决方案2】:

    正如史蒂夫所说:NOTE: This behavior appears to be added to WPF 4.

    我遇到了同样的问题。

    正如 WPF 博士所说

    “这完全不可能 当前的 .NET 版本(3.0 和 3.5 贝塔)。该控件被硬编码为 使用系统设置...它没有 完全看控制模板。”

    http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/bbffa6e3-2745-4e72-80d0-9cdedeb69f7f/

    【讨论】:

    • 感谢您指出这一点,尤其是 ControlTemplate 也被忽略了,因为我可能会尝试其他所有方法都失败。
    • 答案中的第一个链接已失效 - "404 | Page not found".
    【解决方案3】:

    从 .NET 4 开始,TextBoxBase.SelectionBrush

    您可以通过设置 SelectionBrush 和 SelectionOpacity 属性来指定突出显示选定文本的画笔。 SelectionOpacity 属性指定 SelectionBrush 的不透明度。

    例如。

    <TextBox SelectionBrush="Red" SelectionOpacity="0.5"
             Foreground="Blue" CaretBrush="Blue">  
    

    【讨论】:

      【解决方案4】:

      试试这个:

           <Trigger Property="IsHighlighted" Value="True">
                                  <Setter TargetName="Border" Property="Background" Value="OrangeRed"/>
                                  <Setter Property="Foreground" Value="White"/>
                              </Trigger>
      

      【讨论】:

      • IsHighlighted 不是 TextBox 上的属性,您会在哪个元素上使用该触发器?
      • 我再次查看并确认,这不是 TextBox 上的属性。 msdn.microsoft.com/en-us/library/… 我怀疑您使用的是其他类型的控件,或者是自定义派生版本的 TextBox。
      • 上面的例子是一个列表框。
      • 好的,这个问题是关于一个文本框的。 ListBox 是作为示例给出的,其中已经有可用的解决方法。
      【解决方案5】:

      这是一个经过 Windows 8.1 .Net 4.6.1 测试的解决方案,用于自定义应用中每个 TextBoxSelectionBrush

      /// Constructor in App.xaml.cs
      public App() : base()
      {
          // Register an additional SelectionChanged handler for appwide each TextBox
          EventManager.RegisterClassHandler(typeof(TextBox), TextBox.SelectionChangedEvent, RoutedEventHandler(_textBox_selectionChanged));
      }
      
      private void _textBox_selectionChanged(object sender, RoutedEventArgs e)
      {
          // Customize background color of selected text
          (sender as TextBox).SelectionBrush = Brushes.MediumOrchid;
      
          // Customize opacity of background color
          (sender as TextBox).SelectionOpacity = 0.5;
      }
      

      如果您想包含RichTextBox,请将类型名称TextBox 4 次替换为TextBoxBase

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-06
        • 2016-03-29
        • 2012-09-08
        • 1970-01-01
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 2015-04-25
        相关资源
        最近更新 更多