双击文本区域或文本框时指定突出显示行为?

Cor*_*urn 7 c# text highlighting

我注意到许多希望你做大量文本编辑的应用程序会为双击文本提供非默认行为,因为应用程序突出显示它认为你最有可能尝试与之交互的文本.

作为一个简单的例子,这句话在不同的应用程序中表现不同:

这是一个"样本"句子

如果我在记事本中键入它并双击单词'sample'(理想情况下是单词的中间位置,例如,样本的'm'和'p'之间),那么第二个引用之后的第一个引号到空格的记事本高亮显示.如果该句子在Visual Studio中的注释中,并且我在同一位置双击,则会从样本的"s"突出显示"e"而不突出显示引号.

如何在我自己的应用程序中自定义这些突出显示行为?是不同于winform到WPF?我想我可以破解我的方式使它在双击事件上工作,但是有一个更优雅/深思熟虑的解决方案专门用于此吗?

Dan*_*n W 4

是的,使用 DoubleClick 事件来完成您想要的操作是很混乱的,因为它看起来要进行两次选择,速度较慢,看起来更糟,并且可能会触发不需要的事件/代码。

所以下面的代码至少应该可以解决 Winforms 的问题。创建一个新类,并以通常的方式扩展 TextBox(或 RichTextBox)(使用新创建的控件,该控件应该神奇地出现在设计器中)。我做了一个简单的例程,您可以在其中指定要使用的分隔符。只要多做一点工作,就可以很容易地考虑一系列字符,而不仅仅是一个字符,甚至可以创建其他更高级的选择方式。

如果您使用的是 TextBox 而不是 RichTextBox,只需删除类定义中出现两次的“Rich”位即可。

class RichTextBoxX : RichTextBox
{
    char delimiter = ',';   // Specify what character to use for start and end of selection

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if (m.Msg==0x0203) // WM_LBUTTONDBLCLK
        {
            // Perfect situation for off-by-one bugs! Checked thoroughly for at least 10 mins, so should be okay now:
            int start = this.SelectionStart;
            if (start < 1) start = 1;
            int left = this.Text.LastIndexOf(delimiter, start - 1);
            int right = this.Text.IndexOf(delimiter, start);
            if (right == -1) right = Text.Length;
            this.SelectionStart = left + 1;
            this.SelectionLength = right - left - 1;
            return;             
        }

        base.WndProc(ref m);
    }
}
Run Code Online (Sandbox Code Playgroud)