未设置上下文菜单的放置目标

本文关键字:目标 菜单 设置 上下文 | 更新日期: 2023-09-27 18:30:17

我的WPF应用程序有一个按钮,单击它时会打开上下文菜单。我正在使用 MVVM 模式,这里是 XAML 代码。

在 Viewmodel 的 buttonClick() 中,IsOpenMenu 将设置为 true。但是我无法正确启动上下文菜单。

<Button Content="Click Me" Grid.Column="1" Name="btnView1" Height="25" Width="75" Command="{Binding ButtonClick}"
ContextMenuService.IsEnabled="False">
    <Button.ContextMenu>
        <ContextMenu IsEnabled="True" IsOpen="{Binding IsOpenMenu}" PlacementTarget="{Binding ElementName=btnView1}" Placement="Bottom" >
            <MenuItem Header="Menu 1" IsCheckable="True"/>
            <MenuItem Header="Menu 1" IsCheckable="True"/>
            <MenuItem Header="Menu 1" IsCheckable="True"/>
            <MenuItem Header="Menu 1" IsCheckable="True"/>
        </ContextMenu>
    </Button.ContextMenu>
</Button>

但是当我在代码隐藏中设置下面所示的 3 个属性时,我得到了正确的结果。

private void btnView1_Click(object sender, RoutedEventArgs e)
{
    (sender as Button).ContextMenu.IsEnabled = true;
    (sender as Button).ContextMenu.PlacementTarget = (sender as Button);
    (sender as Button).ContextMenu.IsOpen = true;
}  

我觉得上下文菜单上的放置目标属性没有正确设置。我做错了什么吗?

未设置上下文菜单的放置目标

不幸的是,

由于可视化树的工作方式,您编写的 xaml 无法按预期工作,上下文菜单不是按钮所在的可视化树的一部分,因此它无法识别名称 btnView1。

您是否需要上下文菜单每次都出现在同一个位置?如果您将放置目标留空,如果我没记错的话,它应该放在鼠标单击处。