我正在创建一个类似记事本的文本编辑器。我在表单上放置了几个按钮(剪切、删除、复制)。当没有选中文本时,我希望这些按钮处于禁用状态,反之亦然……是否有一些事件发生在文本被选中时?我使用文本框控件。
虽然没有这样的事件,但幸运的是有解决方法:
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将无法工作)。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
}
当有/没有选定文本时,您可以控制启用/禁用您的控件
。