Настройка свойства WPF ContextMenu PlacementTarget в XAML?

<Button Name="btnFoo" Content="Foo" >
    <Button.ContextMenu Placement="Bottom" PlacementTarget="btnFoo">
        <MenuItem Header="Bar" />
    </Button.ContextMenu>
</Button>

дает мне ошибку времени выполнения. Тип UIElement не имеет общедоступного класса TypeConverter

Я также пробовал

<Button Name="btnFoo" Content="Foo" >
    <Button.ContextMenu Placement="Bottom" PlacementTarget="{Binding ElementName=btnFoo}">
        <MenuItem Header="Bar" />
    </Button.ContextMenu>
</Button>

и это положит ContextMenu в верхнем левом углу экрана, а не на кнопку

Ответы

Ответ 1

Вы должны установить прикрепленное свойство ContextMenuService.Placement на кнопке, как указано в примечаниях в документации для ContextMenu.Placement.

<Button Name="btnFoo" Content="Foo" ContextMenuService.Placement="Bottom">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Bar" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

Ответ 2

Вы пробовали это:

<Button Name="btnFoo" Content="Foo">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Bar" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

Это приведет к тому, что ContextMenu откроется, когда вы щелкнули правой кнопкой мыши (на кнопке). Который, я думаю, может быть вашим желаемым местом?? //

--- EDIT --- В этом случае используйте это:

<Button Name="btnFoo" Content="Foo" ContextMenuOpening="ContextMenu_ContextMenuOpening">
    <Button.ContextMenu>
        <ContextMenu Placement="Bottom">
            <MenuItem Header="Bar" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

И в коде позади:

private void ContextMenu_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
    // Get the button and check for nulls
    Button button = sender as Button;
    if (button == null || button.ContextMenu == null)
        return;
    // Set the placement target of the ContextMenu to the button
    button.ContextMenu.PlacementTarget = button;
    // Open the ContextMenu
    button.ContextMenu.IsOpen = true;
    e.Handled = true;
}

Вы можете повторно использовать метод для нескольких кнопок и ContextMenu..

Ответ 3

Вы можете использовать <Menu />, созданный как Button, и избегать проблем с ContextMenuService.