【问题标题】:Is there selection text event in text box文本框中是否有选择文本事件
【发布时间】:2023-03-05 23:28:02
【问题描述】:

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

【问题讨论】:

  • 您在工作区使用什么控件?
  • 如果使用rich text box 是一个选项,您将有这样的事件。

标签: c# winforms


【解决方案1】:

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

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 中选择适当的值,不要忘记将 ENM_SELCHANGE 设置为 EM_SETEVENTMASK):

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 (see also In Idle cannot access RichTextControl or IME will not work)。

【讨论】:

    【解决方案2】:

    如果您使用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

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2011-06-02
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多