c# - Contextmenu 的 PlacementTarget 未设置

标签 c# .net wpf xaml mvvm

这个问题在这里已经有了答案:





Setting a WPF ContextMenu's PlacementTarget property in XAML?

(3 个回答)


6年前关闭。




我的 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;
}  

我觉得 ContextMenu 上的 PlacementTarget 属性设置不正确。
我做错什么了吗?

最佳答案

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

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

关于c# - Contextmenu 的 PlacementTarget 未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26909624/

相关文章:

c# - 在文本文件中加载和访问模板变量

c# - 绑定(bind)到 xpath 时 Mediaelement repeatbehavior 失败

c# - 如何使用 pngBitmapEncoder 保存图像

wpf - 如何在 wpf 中为 Storyboard 设置参数?

c# - 从枚举中获取值到通用列表中

c# - 为什么我不能将 set 访问器添加到覆盖属性?

c# - 打开带有预先确定的 cookie 集的网页

c# - WPF 项目中的 Serilog

c# - MEF:如果我有多个导出但只需要一个导入怎么办?

c# - 在 .NET 应用程序中显式导致 AccessViolationException