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