在XAML中设置WPF ContextMenu的PlacementTarget属性?

时间:2009-08-13 14:18:10

标签: wpf xaml button contextmenu

<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放在屏幕的左上角,而不是按钮

3 个答案:

答案 0 :(得分:25)

您应该在按钮上设置ContextMenuService.Placement附加属性,如ContextMenu.Placement文档中的备注中所述。

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

答案 1 :(得分:3)

你试过这个:

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

这将使ContextMenu在你右键单击鼠标的位置打开(在按钮上)。 我认为可能是你想要的位置吗?

---编辑--- 在这种情况下使用:

<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的..

答案 2 :(得分:0)

您可以使用<Menu />,样式为Button,避免与ContextMenuService一起使用。