WPF Context menu on left click WPF Context menu on left click wpf wpf

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;      }    }  } }