我一直在寻找在用户选择文字时更改文本框高亮颜色的方法。 Windows使用蓝色作为默认颜色。例如,在Microsoft Outlook上,当您编写邮件并选择(突出显示)文本时,背面颜色为灰色。
每个人都说我需要覆盖onPaint方法,但我不知道究竟是怎么做的。 RichTextbox selectedbackground颜色不是解决方案,因为它会更改文本的颜色,而不是用户选择它时。
答案 0 :(得分:1)
作为一种选择,您可以依靠ElementHost
Windows窗体控件来承载WPF TextBox
控件。然后,对于WPF TextBox
控件,设置SelectionBrush
和SelectionOpacity
。
示例
在下面的示例中,我创建了一个包含UserControl
的Windows窗体ElementHost
来承载WPF 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
。
答案 1 :(得分:0)
Hi here is the code to change the selection colour just keep in mind that you will have to store the current colour and then once you've changed the colour and your application closes you would need to restore it because this changes the colour of the whole computer not just for the current process.
[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());
}