文本框中是否有文本选择事件?

6
我正在创建一个类似记事本的文本编辑器。我在表单上放置了几个按钮(剪切、删除、复制)。当没有选中文本时,我希望这些按钮处于禁用状态,反之亦然……是否有一些事件发生在文本被选中时?我使用文本框控件。

你使用什么控件来处理工作区? - BWA
3
如果使用富文本框是一个选项,那么你将拥有这样的事件。 - Veverke
2个回答

7

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

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()和类似的方法可能会破坏某些输入法编辑器(另请参见在空闲期间无法访问RichTextControl或IME将无法工作)。

3
如果您使用的是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
}

当有/没有选定文本时,您可以控制启用/禁用您的控件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接