C# Menu中共享MenuItem

iDotNetSpace發表於2009-07-01

最近碰到個問題,一個MenuItem Add到一個Menu後就會自動去除前一個menu中的引用。因為在Add Menuitem的過程中會呼叫SetOwner內部函式

internal void SetOwner(ToolStrip newOwner)
{
    
if (this.owner != newOwner)
    {
        Font font 
= this.Font;
        
this.owner = newOwner;
        
if (newOwner == null)
        {
            
this.ParentInternal = null;
        }
        
if (!this.state[stateDisposing] && !this.IsDisposed)
        {
            
this.OnOwnerChanged(EventArgs.Empty);
            
if (font != this.Font)
            {
                
this.OnFontChanged(EventArgs.Empty);
            }
        }
    }
}

 

如果要在一個程式中幾個menu用到很多同樣的MenuItem怎麼辦呢?

一個方法是Clone每一個MenuItem,然後Add到Menu中。

另外一個方法就是利用Menu的opeing和closing事件來達到共享同一MenuItem的目的

初始化MenuItem

            this.MenuItem1= new ToolStripMenuItem();
            
this.MenuItem2= new ToolStripMenuItem();

            
this.ContextMenu1 = new ContextMenuStrip();
            
this.ContextMenu2 = new ContextMenuStrip();

           
this.ContextMenu1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
                
this.MenuItem1,
                
this.MenuItem2
            });

掛上事件

       this.ContextMenu2.Opening += new CancelEventHandler(this.ContextMenu2_Opening);
       
this.ContextMenu2.Closing += new ToolStripDropDownClosingEventHandler(this.ContextMenu2_Closing);

動態載入選單

        private void ContextMenu2_Opening(object sender, CancelEventArgs e)
        {
                  
this.ContextMenu2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
                     
this.MenuItem1,
                     
this.MenuItem2
                  });
        }

        
private  void ContextMenu2_Closing(object sender, ToolStripDropDownClosingEventArgs e)
        {

                    
this.ContextMenu1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
                     
this.MenuItem1,
                     
this.MenuItem2
                  });
        }

 這裡只是簡單演示了MenuItem的共享方法,靈活使用這個方法基本可以解決多個MenuItem在Menu中的共享問題

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-608034/,如需轉載,請註明出處,否則將追究法律責任。

相關文章