文本框中是否存在选择文本事件



我正在创建一个小的文本编辑器(就像记事本一样)。我的表单上有几个按钮(剪切、删除、复制)。我希望他们在没有选择文本的情况下不能,反之亦然。。。选择文本时是否发生了某些事件?我使用文本框控件。

没有这样的事件,但幸运的是有解决方法:

1) 通过自己更新Application.Idle事件的UI来完成(我承认这不是最好的解决方案,但它通常是我的最爱,因为它更容易实现):

Application.Idle += OnIdle;

然后:

private void OnIdle(object sender, EventArgs e) {
    btnCopy.Enabled = txtEditor.SelectionLength > 0;
}

2) 从RichTextControl派生您自己的类(如果您必须处理巨大的文件,而不仅仅是大文件,则不是最佳解决方案)并处理EN_SELCHANGE通知(最健壮的类也与我看到的每一种IME兼容)。概念证明(从MSDN中选择合适的值,不要忘记用EM_SETEVENTMASK设置ENM_SELCHANGE):

public class TextBoxEx : TextBox {
    public event EventHandler SelectionChanged;
    protected override void WndProc(ref Message m) {
        base.WndProc(ref m);
        if (m.Msg == WM_NOTIFY && m.lParam == EN_SELCHANGE) {
            OnSelectionChanged(EventArgs.Empty);
        }
    }
    // ...
}

你可以这么做,但是。。。默认控件已经为您提供了此功能:它有一个SelectionChanged事件。

如果您也支持剪贴板粘贴,请小心,因为您需要根据剪贴板内容更新粘贴按钮(然后更容易的位置再次出现在Application.Idle中)。在RichTextControl上调用CanPaste()和类似方法可能会中断某些IME(另请参阅In-Iidle无法访问RichTextControl或IME将不起作用)。

如果使用RichTextBox,则有一个名为SelectedText的属性。您可以检查SelectedText是否为空:

if (richTextBox1.SelectedText.Length > 0){ //means there is a selection
}

结合SelectionChanged事件:

private void richTextBox1_SelectionChanged(object sender, EventArgs e) {
    bool enabled = richTextBox1.SelectedText.Length > 0;
    //do something
}

当有/没有选择文本时,您可以控制启用/禁用Control

最新更新