2015-06-11 21 views
1

的(ToolStrip的)父母我寫一個自定義的ToolStripProfessionalRenderer得到一個ToolStripDropDownMenu

舉個例子,以下重寫:

protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) 
{ 
    if(e.ToolStrip is MenuStrip) 
    { 
     // It never is. It's always ToolStripDropDownMenu 
    } 
} 

我想這OnRenderImageMargin通過下拉菜單,因爲這叫做是什麼將呈現,但是我想獲得導致OnRenderImageMargin調用的父母ToolStrip/MenuStrip/StatusStrip

這可能嗎?

+0

這有什麼錯'ToolStripDropDownMenu.Parent'? – InBetween

回答

1

我認爲e.ToolStrip.Parent屬性將是關鍵,但它總是null

一個選項是在您的ToolStripProfessionalRenderer中創建一個構造函數,並傳入一個對該控件的引用。

class CustomRenderer : ToolStripProfessionalRenderer 
{ 
    // All those controls derive from ToolStrip so we can use the base class here 
    private ToolStrip ts; 

    public CustomRenderer(ToolStrip ts) 
    { 
     this.ts = ts; 
    } 

    protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) 
    { 
     if (ts is MenuStrip) 
     { 
     } 
     else if (ts is StatusStrip) 
     { 
     } 
     else // ts is ToolStrip 
     { 
     } 
    } 

然後通過當實例它在一個參考:

toolStrip1.Renderer = new CustomRenderer(toolStrip1); 

statusStrip1.Renderer = new CustomRenderer(statusStrip1); 

一種替代選擇,從this answer修改。

忘記構造函數和測試Owner反覆,直到你得到正確的父控件:

protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) 
{ 
    ToolStrip owner = e.ToolStrip; 
    while (owner is ToolStripDropDownMenu) 
     owner = (owner as ToolStripDropDownMenu).OwnerItem.Owner; 

    if (ts is MenuStrip) 
    { 
    } 
    else if (ts is StatusStrip) 
    { 
    } 
    else // ts is ToolStrip 
    { 
    }  
}