14

The WPF TextBox natively makes use of the System Highlight color for painting the background of selected text. I would like to override this and make it consistent since it varies by OS/user theme.

For ListBoxItems, there is a neat trick (see below) where you can override the resource key for the HighlightBrushKey to customize the System Highlight color in a focused setting:

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

The same trick does not work for the TextBox unfortunately. Does anyone have any other ideas, besides "override the ControlTemplate"?

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

ouflak
  • 2,458
  • 10
  • 44
  • 49
Steve Cadwallader
  • 2,656
  • 4
  • 28
  • 37

5 Answers5

11

Since .NET 4, TextBoxBase.SelectionBrush

You can specify the brush that highlights selected text by setting the SelectionBrush and SelectionOpacity properties. The SelectionOpacity property specifies the opacity of the SelectionBrush.

eg.

<TextBox SelectionBrush="Red" SelectionOpacity="0.5"
         Foreground="Blue" CaretBrush="Blue">  
Colonel Panic
  • 132,665
  • 89
  • 401
  • 465
10

As Steve mentioned : NOTE: This behavior appears to be added to WPF 4.

I bumped into the same problem.

As Dr.WPF says

"It is entirely impossible in the current .NET releases (3.0 & 3.5 beta). The control is hardcoded to use the system setting... it doesn't look at the control template at all."

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

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Nash
  • 2,560
  • 2
  • 18
  • 18
0

This is a Windows 8.1 .Net 4.6.1 tested solution to customize the SelectionBrush of each TextBox in the app:

/// 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;
}

If you want to include RichTextBox replace type name TextBox 4 times by TextBoxBase.

Pollitzer
  • 1,580
  • 3
  • 18
  • 28
-1

Try this:

     <Trigger Property="IsHighlighted" Value="True">
                            <Setter TargetName="Border" Property="Background" Value="OrangeRed"/>
                            <Setter Property="Foreground" Value="White"/>
                        </Trigger>
user3410566
  • 45
  • 2
  • 15
  • 2
    IsHighlighted is not a property on TextBox, what element would you use that trigger on? – Steve Cadwallader Dec 03 '15 at 17:01
  • 1
    I looked again and confirmed, that is not a property on TextBox. https://msdn.microsoft.com/en-us/library/system.windows.controls.textbox%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 I suspect you are using some other type of control, or a custom derived version of TextBox. – Steve Cadwallader Jan 16 '16 at 21:03
  • The example above is for a ListBox. – user3410566 Apr 13 '17 at 06:23
  • Ok, this question was about a TextBox. ListBox was given as an example where there was already a workaround available. – Steve Cadwallader Apr 13 '17 at 13:13
-1

You can create a Style for the TextBox and write a Setter for the background. The TextBox style should be a default one so that any TextBox which comes under the visual tree will get the changed TextBox

<Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
Jobi Joy
  • 49,102
  • 20
  • 108
  • 119
  • 3
    That would change the background color of the entire text box, what I was looking for is how to change the background for the highlighted portion only. Thanks anyways though. – Steve Cadwallader Jan 02 '09 at 19:13