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

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>

这会将上下文菜单放置在我的屏幕左上角,而不是在按钮处

3个回答

28

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

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

1
根据MSDN文档所述,当上下文菜单打开时(根据用户打开菜单的方式),PlacementTarget属性会发生更改(变为MousePoint或Center)。因此,在该属性上设置绑定将不起作用 - 它将被更改。 - Tarsier
哦...我明白了。他们应该将其标记为只读,这样会更少令人困惑。谢谢! - VitalyB
1
当这个被实现后,右键点击鼠标会出现上下文菜单。是否可能在左键点击鼠标时弹出上下文菜单?提前致谢。 - samar

4

你尝试过这个吗:

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

这将使上下文菜单在您鼠标右键单击的位置(按钮上)打开。 我认为这可能是您想要的位置,对吗?
--- 编辑 --- 在这种情况下,请使用以下内容:
<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;
}

您可以将该方法重复使用于多个按钮和上下文菜单中。

1
我工作的项目很久以前开始使用按钮和上下文菜单创建ComboBox效果。虽然这可能有点傻,但现在改变已经太晚了。因此,我希望上下文菜单在按钮下面打开,而不是在实际点击发生的位置打开。 - kenwarner
当这个被实现后,右键点击鼠标会出现上下文菜单。是否可能在左键点击鼠标时实现相同的功能呢?提前致谢。 - samar

0
你可以使用一个样式为Button<Menu />,避免使用ContextMenuService带来的麻烦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接