左键单击WPF上下文菜单

左键单击WPF上下文菜单,wpf,mvvm,contextmenu,mouseleftbuttondown,Wpf,Mvvm,Contextmenu,Mouseleftbuttondown,我有一个WPF应用程序..其中我在Xaml文件中有一个图像控件 右键点击这个图像,我有一个上下文菜单 我想有相同的显示在“左键点击”也 如何以MVVM的方式实现这一点?您可以使用像这样的图像的MouseDown事件来实现这一点 <Image ... MouseDown="Image_MouseDown"> <Image.ContextMenu> <ContextMenu> <MenuItem .../>

我有一个WPF应用程序..其中我在Xaml文件中有一个图像控件

右键点击这个图像,我有一个上下文菜单

我想有相同的显示在“左键点击”也


如何以MVVM的方式实现这一点?

您可以使用像这样的图像的MouseDown事件来实现这一点

<Image ... MouseDown="Image_MouseDown">
    <Image.ContextMenu>
        <ContextMenu>
            <MenuItem .../>
            <MenuItem .../>
        </ContextMenu>
    </Image.ContextMenu>
</Image>

如果只想在Xaml中执行此操作而不使用代码隐藏,可以使用Expression Blend的触发器支持:

...
xmlns:i="schemas.microsoft.com/expression/2010/interactivity"
...

<Button x:Name="addButton">
    <Button.ContextMenu>
        <ContextMenu ItemsSource="{Binding Items}" />
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <ei:ChangePropertyAction TargetObject="{Binding ContextMenu, ElementName=addButton}" PropertyName="PlacementTarget" Value="{Binding ElementName=addButton, Mode=OneWay}"/>
                <ei:ChangePropertyAction TargetObject="{Binding ContextMenu, ElementName=addButton}" PropertyName="IsOpen" Value="True"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Button.ContextMenu>
</Button>
。。。
xmlns:i=“schemas.microsoft.com/expression/2010/interactivity”
...

只需将代码添加到函数Image\u MouseDown中即可

e、 已处理=正确


然后它不会消失。

这里有一个仅限XAML的解决方案。 只需将此样式添加到按钮。 这将导致在左键和右键单击时打开关联菜单。享受吧

<Button Content="Open Context Menu">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <EventTrigger RoutedEvent="Click">
                    <EventTrigger.Actions>
                        <BeginStoryboard>
                            <Storyboard>
                                <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen">
                                    <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
                                </BooleanAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger.Actions>
                </EventTrigger>
            </Style.Triggers>
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu>
                        <MenuItem />
                        <MenuItem />
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </Button.Style>
</Button>

您可以将contextMenu的Isopen属性绑定到viewModel中的属性,如“IsContextMenuOpen”。 但问题是您不能直接将contextmenu绑定到viewModel,因为它不是userControl层次结构的一部分。因此,要解决这个问题,您应该将tag属性绑定到视图的DataContext

<Image Tag="{Binding DataContext, ElementName=YourUserControlName}">
<ContextMenu IsOpen="{Binding PlacementTarget.Tag.IsContextMenuOpen,Mode=OneWay}" >
.....
</ContextMenu>
<Image>

.....

祝你好运。

你可以发明自己的DependencyProperty,当点击图像时,它会打开一个上下文菜单,如下所示:

  <Image Source="..." local:ClickOpensContextMenuBehavior.Enabled="True">
      <Image.ContextMenu>...
      </Image.ContextMenu>
  </Image>
XAML


嘿,我遇到了同样的问题,我在这里没有找到解决方案

我对MVVM一无所知,所以它可能不是符合MVVM的,但对我来说很有效

步骤1:给你的上下文菜单起个名字

<Button.ContextMenu>
    <ContextMenu Name="cmTabs"/>
</Button.ContextMenu>
第三步:享受



这将对左键和右键单击作出反应。这是一个带有控制模板的ImageBrush按钮。

虽然有可能,但在左键单击时显示上下文菜单将违背windows的标准要求。关于制作此MVVM,我相信XAML将在您的“视图”中,图像鼠标向下的C代码将在您的“视图模型”中,而您的“模型”中不应了解上下文菜单的任何信息。此实现会导致上下文菜单出现并立即消失。我正在DataTemplate中使用控件及其上下文菜单,不确定这是否重要…这似乎不会引发ContextMenuOpening事件,因此依赖该事件的代码将不会运行。如果要将其添加到按钮(而不是图像),只需使用MouseUp事件然后将类似于此的代码放在按钮点击事件本身中。您能在示例中指定xml名称空间吗?xmlns=”“xmlns:i=”“这与epalm在另一个回答中提到的问题相同我的问题是没有完整的代码列表,因此“”没有意义。此外,如果我将其插入到我拥有的沙盒应用程序中,我仍然会收到语法错误。我使用的是.Net4.5,VS2013,所以我很确定它不是那样的!适用于我在WindowsFormsHost中单击鼠标右键-TargetObject更改为WindowsFormsHost(DockPanel)之外的元素样式正确,但是,当我将命令添加到MenuItem时,它不会触发事件。我已经验证了-绑定是正确的。有什么想法吗?我对@utkarsh也有同样的问题,当我尝试将命令绑定到MenuItem时,
不起作用,有什么建议吗?似乎上下文菜单的数据绑定只在右键单击时设置。在右键单击打开它之后,它也会在左键单击时工作。这就是我最终使用此解决方案的原因:这非常有用,但我需要将
上下文菜单的
放置目标
分配回
依赖对象
(在我的情况下,
按钮
),以便正确填充菜单。这是为
列表视图中的每个项目填充的动态上下文菜单。我在菜单项中使用了它(如果单击,将显示子菜单),但不起作用。我仍然需要右键单击以使菜单显示为我所做的
myFrameworkElement.ContextMenu.PlacementTarget=myFrameworkElement
。谢谢@EricP.OP正在询问有关图像控件上的clickevent的问题。您正在为按钮控件提供解决方案。无需为上下文菜单提供名称。您可以通过以下按钮获得它:``private void cmdExportButton\u Click(object sender,RoutedEventArgs e){button exportButton=(button)发件人;exportButton.ContextMenu.PlacementTarget=exportButton;exportButton.ContextMenu.Placement=PlacementMode.Bottom;exportButton.ContextMenu.StaysOpen=true;exportButton.ContextMenu.IsOpen=true;}```
    <Button x:Name="b" Content="button"  Click="b_Click" >
        <Button.ContextMenu >
            <ContextMenu   >
                <MenuItem Header="Open" Command="{Binding OnOpen}" ></MenuItem>
                <MenuItem Header="Close" Command="{Binding OnClose}"></MenuItem>                    
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
    private void be_Click(object sender, RoutedEventArgs e)
        {
        b.ContextMenu.DataContext = b.DataContext;
        b.ContextMenu.IsOpen = true;            
        }
<Button.ContextMenu>
    <ContextMenu Name="cmTabs"/>
</Button.ContextMenu>
Private Sub Button_Click_1(sender As Object, e As Windows.RoutedEventArgs)
        cmTabs.StaysOpen = True
        cmTabs.IsOpen = True
    End Sub