This question already has answers here:
Setting a WPF ContextMenu's PlacementTarget property in XAML?

(3个答案)


4年前关闭。




我的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/

10-11 00:59