【问题标题】:PlacementTarget of Contextmenu is not getting set [duplicate]Contextmenu 的 PlacementTarget 未设置 [重复]
【发布时间】:2014-11-13 13:07:18
【问题描述】:

我的 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 属性设置不正确。 我做错什么了吗?

【问题讨论】:

  • 尝试在btnView1_Click 处理程序中设置一些断点,看看它是否真的被触发了。代码对我来说看起来不错。
  • 检查您是否正确地对属性 IsOpenMenu 执行通知属性更改,并且在您用于验证事物的事件处理程序中,检查上下文菜单数据上下文是。

标签: c# .net wpf xaml mvvm


【解决方案1】:

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

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

【讨论】:

  • 是的,我想要点击按钮下方的上下文菜单。
  • 在这种情况下,我只会在您的代码后面执行解决方法,无论如何从后面的代码而不是视图模型启动上下文菜单更有意义。有一些 xaml 解决方案,但它们都有些迟钝,或者另一种选择是创建一个新的上下文菜单控件,该控件从其父级继承名称范围。
  • 感谢大家的回复。我将使用代码隐藏来设置三个属性。
  • 没问题。如果您发现我的回答有帮助(至少是关于视觉树的部分),请投票/标记为答案,谢谢。
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 2018-04-08
  • 1970-01-01
相关资源
最近更新 更多