Получить (ToolStrip) родителя ToolStripDropDownMenu

Я пишу пользовательский ToolStripProfessionalRenderer

Возьмем, к примеру, следующее переопределение:

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

Я предполагаю, что OnRenderImageMargin вызывается раскрывающимся меню, поскольку это то, что будет отображаться, однако я хочу получить родительский ToolStrip/MenuStrip/StatusStrip, вызвавший вызов OnRenderImageMargin.

Это возможно?


person Matthew Layton    schedule 11.06.2015    source источник
comment
Что не так с ToolStripDropDownMenu.Parent?   -  person InBetween    schedule 11.06.2015


Ответы (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);

Альтернативный вариант, измененный из этого ответа.

Забудьте о ctor и неоднократно тестируйте 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
    {
    }      
}
person Grant Winney    schedule 11.06.2015