none
记事本添加timer控件监测是否选定文本,如果选定则:剪切,复制,删除子菜单和快捷键可用,否则不行,求代码 RRS feed

答案

  • 您好,

    您可以透过检查RichTextBox中的SelectedText是否为空值!

    Clipboard有没有资料,可透过 Clipboard.ContainsText(TextDataFormat.Text )来判断!

    private void timer1_Tick(object sender, EventArgs e)
    {
    	this.複製CToolStripMenuItem.Enabled = (!string.IsNullOrEmpty(this.richTextBox1.SelectedText));
    	this.剪下TToolStripMenuItem.Enabled = (!string.IsNullOrEmpty(this.richTextBox1.SelectedText));
    }


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年5月2日 4:51
  • 首先不需要用 timer 控件轮询状态,你的实现思路是不正确的(虽然可以实现)。

    1)判断用户是否选择了文本或剪贴板是否有文本,用“亂馬客” 的方法判断。

    2)主菜单包括上下文菜单,有 DropDownOpening 事件(上下文菜单则为 Opening 事件),这个事件是在下拉菜单显示前触发,你应该在这个事件里编写禁用菜单项的代码。
    注意:
    1)如果是 MenuStrip 则为 DropDownOpening 事件;
    2)如果是 ContextMenuStrip 则为 Opening 事件;
    3)如果是 MainMenu 、ContextMenu(VS2003的)则是 Popup 事件

    如:void 下拉菜单_DropDownOpening(.....) //
    {
        this.复制菜单项.Enabled = this.文本框.SelectedText.Length > 0;
        // .... 若干菜单项代码(略)...
    }

    3)复制、剪切... 等事件处理程序中,首先要判断用户是否选择了文本,如果没有选择则直接 return 不响应用户操作(起到禁用快捷键功能)。

    如:void 复制菜单项_Click(...)
    {
         if(this.文本框.SelectedText.Length == 0)  // 如果用户没有选择文本,则不进行任何处理
             return;

        // 剪贴板操作时完全有可能发生错误的,以下代码建议 try...catch 捕获错误。
        Clipboard.Clear();   // 清除剪贴板
        Clipboard.SetText(文本框.SelectedText); // 将文本数据复制到剪贴板
    }

    2012年5月2日 7:28

全部回复

  • 您好,

    您可以透过检查RichTextBox中的SelectedText是否为空值!

    Clipboard有没有资料,可透过 Clipboard.ContainsText(TextDataFormat.Text )来判断!

    private void timer1_Tick(object sender, EventArgs e)
    {
    	this.複製CToolStripMenuItem.Enabled = (!string.IsNullOrEmpty(this.richTextBox1.SelectedText));
    	this.剪下TToolStripMenuItem.Enabled = (!string.IsNullOrEmpty(this.richTextBox1.SelectedText));
    }


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    2012年5月2日 4:51
  • 首先不需要用 timer 控件轮询状态,你的实现思路是不正确的(虽然可以实现)。

    1)判断用户是否选择了文本或剪贴板是否有文本,用“亂馬客” 的方法判断。

    2)主菜单包括上下文菜单,有 DropDownOpening 事件(上下文菜单则为 Opening 事件),这个事件是在下拉菜单显示前触发,你应该在这个事件里编写禁用菜单项的代码。
    注意:
    1)如果是 MenuStrip 则为 DropDownOpening 事件;
    2)如果是 ContextMenuStrip 则为 Opening 事件;
    3)如果是 MainMenu 、ContextMenu(VS2003的)则是 Popup 事件

    如:void 下拉菜单_DropDownOpening(.....) //
    {
        this.复制菜单项.Enabled = this.文本框.SelectedText.Length > 0;
        // .... 若干菜单项代码(略)...
    }

    3)复制、剪切... 等事件处理程序中,首先要判断用户是否选择了文本,如果没有选择则直接 return 不响应用户操作(起到禁用快捷键功能)。

    如:void 复制菜单项_Click(...)
    {
         if(this.文本框.SelectedText.Length == 0)  // 如果用户没有选择文本,则不进行任何处理
             return;

        // 剪贴板操作时完全有可能发生错误的,以下代码建议 try...catch 捕获错误。
        Clipboard.Clear();   // 清除剪贴板
        Clipboard.SetText(文本框.SelectedText); // 将文本数据复制到剪贴板
    }

    2012年5月2日 7:28