这个东西怎么可能会有系统的标准实现呢? 实际的情况是千变万化的。在MenuItem的Popup事件中,来根据条件判断禁用或启用某菜单项。比如一个画图程序,在Popup事件中,你可以检查,当前客户区中是否选中了图像,如果有,就启用剪切,粘贴,同时检查剪切板中是否有某种支持的图像格式,如果有就启用粘贴菜单。如果是字处理,那就要换成检查文本,或RTF。。如果是自己开发的窗口设计器,那就要检查自定义的格式。

解决方案 »

  1.   

    用mfc好像有系统提供的默认实现,
    现在在c#中如何实现呢?
    如果自己写代码的话,需要对每个子窗口的每个编辑控件进行跟踪,那要郁闷死的
      

  2.   

    其实自己写也很简单的,因为richTextBox已经有了很多判断菜单是否可用的方法:比如:richTextBox.CanUndo();
    richTextBox.CanRedo();
    RichTextBox.CanPaste();
      

  3.   

    关键是程序中不可能只有一个或几个简单的textBox啊,而且通常分布在不同的mdi子窗口中,如果在每个控件的事件中去处理当前的编辑状态,再去相应改变菜单的状态,简直是不可思议的。而且菜单事件的入口通常只有一个,在这个事件处理程序中如何去处理可能用户当前在不同类型的编辑控件中,还需要判断当前空间是textBox还是combo或是其他的,在分别作出不同的处理,编辑控件类型比较多的话,也不是完美的解决方法。
      

  4.   

    你用一个ContextMenu1控件,设置所有的richTextBox的ContextMenu属性为ContextMenu1,至于是什么控件调用了ContextMenu1,可以有用ContextMenu1.SourceControl属性得到的!!!
    -----------------------------------
    如果是一般的编辑控件,比如:textBox,comboBox,这些就不用了,这些控件在运行时单击右键,系统会自动弹出编辑菜单的!!!
      

  5.   

    那怎么把contextmenul控件关联到系统的主菜单(编辑菜单)上呢?
      

  6.   

    //EditItem是主菜单(编辑菜单)
    private void EditItem_Select(object sender, System.EventArgs e)
    {
    MenuItem[] items=new MenuItem[contextMenu1.MenuItems.Count];
    contextMenu1.MenuItems.CopyTo(items,0);
    EditItem.MenuItems.AddRange(items);
    }//不过这样的话,在contextMenu1_Popup事件中写相应的代码,因为什么的代码是把
    //contextMenu1的子菜单转到EditItem,转后contextMenu1就没有子菜单了,又要从
    //edititem转过来,这样是比较麻烦的,最好就自己多做一些edititem的子菜单啦。
    //让contextmenul的子菜单与edititem子菜单的事件关联就行了