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

4

3 回答 3

26

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

<Button Name="btnFoo" Content="Foo" ContextMenuService.Placement="Bottom">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Bar" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>
于 2010-06-18T16:16:43.497 回答
4

你有没有试过这个:

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

于 2009-08-13T14:26:18.640 回答
0

您可以使用<Menu />, 样式化为 aButton并避免使用ContextMenuService.

于 2017-12-13T18:58:36.370 回答