wpf 是否可以通过左键单击打开上下文菜单?

wdebmtf2  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(118)

因此,问题是如何通过左键单击打开上下文菜单,并以相同的方式使用命令绑定和MVVM。
我尝试了第一个带style的堆栈溢出方法来打开上下文菜单。它工作,但命令不工作。

tzcvj98z

tzcvj98z1#

关于你问题的第一部分,ContextMenu默认的打开模式是左键单击它的容器,所以你不必实现任何特殊的东西来实现这一点。

<Button Height="30" Width="50" Content="Hello world!">
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Hello" />
            <MenuItem Header="World!" />
        </ContextMenu>
    </Button.ContextMenu>
</Button>

字符串
关于用MVVM命令绑定MenuItems,解决方案相当棘手;由于ContextMenu本身不在VisualTree上,因此无法引用命令来与RelativeSource绑定。解决这个问题的方法是创建一个自定义BindingProxy,将DataContext与MenuItem链接起来

public class BindingProxy : Freezable
{
    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register(nameof(Data), typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));

    public object Data
    {
        get { return (object)GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }
}


最终的结果将是......

<xmlns:local="MyDemoApp/.../..."> <!-- BindingProxy namespace -->

<Button Height="30" Width="50" Content="Hello world!">
    <Button.Resources>
        <local:BindingProxy x:Key="Proxy" Data="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type Button}}}" />
    </Button.Resources>
    <Button.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Hello" Command="{Binding Data.MyFirstCommand, Source={StaticResource Proxy}}"/>
            <MenuItem Header="World!" Command="{Binding Data.MySecondCommand, Source={StaticResource Proxy}}"/>
        </ContextMenu>
    </Button.ContextMenu>
</Button>

wf82jlnq

wf82jlnq2#

使用XAML

以下XAML代码将创建一个按钮,当您使用鼠标左键或右键单击该按钮时,该按钮将打开上下文菜单:

<Style x:Key="ContextMenuOnLeftClick" TargetType="Button">
    <Setter Property="ContextMenu" Value="{StaticResource ContextMenu}" />
    <Setter Property="ContextMenuPlacementMode" Value="MousePoint" />
</Style>

<ContextMenu x:Name="ContextMenu">
    <MenuItem Header="Item 1" />
    <MenuItem Header="Item 2" />
</ContextMenu>

字符串
ContextMenuOnLeftClick样式会将按钮的ContextMenu属性设定为ContextMenu项目。ContextMenuPlacementMode属性设定为MousePoint,表示快显功能表会在鼠标器指标的位置开启。

使用C#

下列C#程式码也会建立一个按钮,当您以鼠标器左键或右击按一下该按钮时,就会开启内容功能表:

public class MainWindow : Window
{
    private ContextMenu _contextMenu;

    public MainWindow()
    {
        _contextMenu = new ContextMenu();
        _contextMenu.Items.Add(new MenuItem("Item 1"));
        _contextMenu.Items.Add(new MenuItem("Item 2"));

        Button button = new Button();
        button.Content = "Button";
        button.ContextMenu = _contextMenu;

        this.Content = button;
    }
}


此代码创建一个ContextMenu元素,并向其中添加两个MenuItem对象。然后,ContextMenu元素会指派给Button对象的ContextMenu属性。
要在单击按钮时打开上下文菜单,可以处理按钮的MouseDown事件。在MouseDown事件行程常式中,您可以将ContextMenu元素的IsOpen属性设定为true
希望这对你有帮助!

相关问题