Измените цвет выделения TextBox, когда пользователь выбирает текст?

Я искал способ изменить цвет выделения текстового поля, когда пользователь выбирает текст. Windows использует синий цвет по умолчанию. Например, в Microsoft Outlook, когда вы пишете почту и выбираете (выделяете) текст, задний цвет является серым.

Selected text in Outlook

TextBox selected text by user

Все говорили, что мне нужно переопределить метод onPaint, но я не знаю, как это сделать. Выбранный RichTextbox обратный цвет не является решением, поскольку он изменяет цвет текста, а не когда пользователь его выбирает.

Ответ 1

Как вариант, вы можете положиться на элемент управления ElementHost Windows Forms для размещения TextBox управления WPF TextBox. Затем для TextBox управления WPF TextBox установите SelectionBrush и SelectionOpacity.

пример

В следующем примере я создал Windows Forms UserControl, содержащий ElementHost для размещения WPF TextBox управления. Затем для TextBox управления WPF TextBox установите SelectionBrush и SelectionOpacity.

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms.Integration;
using System.Windows.Media;
public class MyWPFTextBox : System.Windows.Forms.UserControl
{
    private ElementHost elementHost = new ElementHost();
    private TextBox textBox = new TextBox();
    public MyWPFTextBox()
    {
        textBox.SelectionBrush = new SolidColorBrush(Colors.Gray);
        textBox.SelectionOpacity = 0.5;
        textBox.TextAlignment = TextAlignment.Left;
        textBox.VerticalContentAlignment = VerticalAlignment.Center;
        elementHost.Dock = System.Windows.Forms.DockStyle.Fill;
        elementHost.Name = "elementHost";
        elementHost.Child = textBox;
        textBox.TextChanged += (s, e) => OnTextChanged(EventArgs.Empty);
        Controls.Add(elementHost);
    }
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
    public override string Text
    {
        get { return textBox.Text; }
        set { textBox.Text = value; }
    }
}

Ссылочные сборки

Здесь необходимы обязательные сборки: PresentationCore, PresentationFramework, WindowsBase, WindowsFormsIntegration.

Ответ 2

Привет, вот код для изменения цвета выделения, просто имейте в виду, что вам нужно будет сохранить текущий цвет, а затем, как только вы измените цвет, и ваше приложение закроется, вам нужно будет его восстановить, потому что это изменяет цвет всего компьютера не только для текущего процесса.

    [DllImport("user32.dll")]
    static extern bool SetSysColors(int cElements, int[] lpaElements, uint[] lpaRgbValues);


    void ChangeSelectColour(Color color)
    {
        const int COLOR_HIGHLIGHT = 13;
        const int COLOR_HIGHLIGHTTEXT = 14;
        // You will have to set the HighlightText colour if you want to change that as well.


        //array of elements to change
        int[] elements = { COLOR_HIGHLIGHT };


        List<uint> colours = new List<uint>();
        colours.Add((uint)ColorTranslator.ToWin32(color));

        //set the desktop color using p/invoke
        SetSysColors(elements.Length, elements, colours.ToArray());
    }