WPF Context menu on left click
Here is a XAML only solution.Just add this style to your button.This will cause the context menu to open on both left and right click. Enjoy!
<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>
You can do this by using the MouseDown event of an Image like this
<Image ... MouseDown="Image_MouseDown"> <Image.ContextMenu> <ContextMenu> <MenuItem .../> <MenuItem .../> </ContextMenu> </Image.ContextMenu></Image>
And then show the ContextMenu in the EventHandler in code behind
private void Image_MouseDown(object sender, MouseButtonEventArgs e){ if (e.ChangedButton == MouseButton.Left) { Image image = sender as Image; ContextMenu contextMenu = image.ContextMenu; contextMenu.PlacementTarget = image; contextMenu.IsOpen = true; e.Handled = true; }}
You can invent your own DependencyProperty which opens a context menu when image is clicked, just like this:
<Image Source="..." local:ClickOpensContextMenuBehavior.Enabled="True"> <Image.ContextMenu>... </Image.ContextMenu> </Image>
And here is a C# code for that property:
public class ClickOpensContextMenuBehavior{ private static readonly DependencyProperty ClickOpensContextMenuProperty = DependencyProperty.RegisterAttached( "Enabled", typeof(bool), typeof(ClickOpensContextMenuBehavior), new PropertyMetadata(new PropertyChangedCallback(HandlePropertyChanged)) ); public static bool GetEnabled(DependencyObject obj) { return (bool)obj.GetValue(ClickOpensContextMenuProperty); } public static void SetEnabled(DependencyObject obj, bool value) { obj.SetValue(ClickOpensContextMenuProperty, value); } private static void HandlePropertyChanged( DependencyObject obj, DependencyPropertyChangedEventArgs args) { if (obj is Image) { var image = obj as Image; image.MouseLeftButtonDown -= ExecuteMouseDown; image.MouseLeftButtonDown += ExecuteMouseDown; } if (obj is Hyperlink) { var hyperlink = obj as Hyperlink; hyperlink.Click -= ExecuteClick; hyperlink.Click += ExecuteClick; } } private static void ExecuteMouseDown(object sender, MouseEventArgs args) { DependencyObject obj = sender as DependencyObject; bool enabled = (bool)obj.GetValue(ClickOpensContextMenuProperty); if (enabled) { if (sender is Image) { var image = (Image)sender; if (image.ContextMenu != null) image.ContextMenu.IsOpen = true; } } } private static void ExecuteClick(object sender, RoutedEventArgs args) { DependencyObject obj = sender as DependencyObject; bool enabled = (bool)obj.GetValue(ClickOpensContextMenuProperty); if (enabled) { if (sender is Hyperlink) { var hyperlink = (Hyperlink)sender; if(hyperlink.ContextMenu != null) hyperlink.ContextMenu.IsOpen = true; } } } }