【问题标题】:How to change( and later restore) default context menu in textbox如何更改(以及稍后恢复)文本框中的默认上下文菜单
【发布时间】:2013-03-12 22:53:14
【问题描述】:

我想更改默认文本框上下文菜单,所以我创建了自己的菜单,然后我就这样分配了它们

texbox.ContextMenu = myContextMenu

但是我不知道如何恢复默认文本框菜单(在运行时)。我需要 myContextMenu 仅在我用鼠标右键单击文本框时显示(同时按住 Control 按钮)。在其他情况下,我需要显示默认的文本框上下文菜单。 有可能吗??

【问题讨论】:

    标签: c# wpf contextmenu default


    【解决方案1】:

    这是微软给出的例子:

    http://msdn.microsoft.com/en-us/library/ms750420.aspx

    为了记录,这里是使用 WinForms 的方法:

    public partial class TextBoxContextMenuDemo : Form
    {
        ContextMenu mnuContextDefault;
        ContextMenu mnuContextAlt;
    
        MenuItem mnuItmAltMenuTest;
    
        public TextBoxContextMenuDemo()
        {
            InitializeComponent();
            InitializeAltContextMenu();
        }
    
        private void InitializeAltContextMenu()
        {
            mnuContextDefault = new ContextMenu();
            mnuContextDefault = this.TextBox1.ContextMenu;
    
            mnuItmAltMenuTest = new MenuItem();
            mnuItmAltMenuTest.Index = -1;
            mnuItmAltMenuTest.Text = "Test Menu Item";
            mnuItmAltMenuTest.Click += new System.EventHandler(this.mnuItmAltMenuTest_Click);
    
            mnuContextAlt = new ContextMenu();
            mnuContextAlt.MenuItems.Add(mnuItmAltMenuTest);
        }
    
        private void TextBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                if ((Control.ModifierKeys == Keys.Control))
                {
                    this.TextBox1.ContextMenu = mnuContextAlt;
                    TextBox1.ContextMenu.Show(TextBox1, new Point(e.X, e.Y));
                }
                else
                {
                    this.TextBox1.ContextMenu = mnuContextDefault;
                }
            }
        }
    
        private void mnuItmAltMenuTest_Click(object sender, System.EventArgs e)
        {
            MessageBox.Show("You clicked the alternate test menu item!");
        }
    }
    

    HTH!

    【讨论】:

    • 呃,写得更糟糕的 MSDN 示例代码。在其他问题中,使用 new ContextMenu 对象初始化 mnuContextDefault,然后立即将其设置为 TextBox1.ContextMenu 是非常多余的。而且这段代码永远不会恢复默认的上下文菜单,尽管保存它很麻烦。
    • 等等...此示例代码不是来自链接的 MSDN 文章。这与您在此处发布的内容不同。你从哪里得到的?
    • @CodyGray 我写了这段代码。对于您指出的错误(冗余初始化),我深表歉意。我想指出,如果右键单击文本框时未按下 ctrl 按钮,代码 确实 会恢复默认上下文菜单。
    【解决方案2】:

    这实际上比最初看起来要困难得多。我相信默认的上下文菜单是控件实际模板的一部分。

    如果您只想剪切/复制/粘贴,最简单的方法是创建第二个 ContextMenu 来实现这些选项。如果你这样做了,你可以使用内置的ApplicationCommands 不仅实现功能,还可以自动本地化这个 ContextMenu。

    【讨论】:

    • 我试试这个,但也许我可以以某种方式将默认菜单复制到单独的对象?也许使用 xaml 阅读器或其他东西?
    【解决方案3】:

    您可以将 ContextMenu-Property 设置为 null。 OnContextMenuOpening 事件也可以为您提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2010-12-19
      • 2015-06-24
      相关资源
      最近更新 更多