Самый простой способ сделать это - использовать поведение. Это позволит вам использовать его в XAML без какого-либо кода. Вы также можете использовать это поведение в другом месте.
XAML
<Button
Width="100"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="123">
<i:Interaction.Behaviors>
<local:ButtonContextMenuLeftClickBehavior />
</i:Interaction.Behaviors>
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="Menu item 1" />
<MenuItem Header="Menu item 2" />
<Separator />
<MenuItem Header="Menu item 3" />
</ContextMenu>
</Button.ContextMenu>
</Button>
Поведение
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Interactivity;
namespace SO
{
public class ButtonContextMenuLeftClickBehavior : Behavior<Button>
{
public ButtonContextMenuLeftClickBehavior()
{
}
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.Loaded += OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
AssociatedObject.Click += OnClick;
}
private void OnClick(object sender, RoutedEventArgs e)
{
if (!(sender is Button button) || button.ContextMenu == null) return;
button.ContextMenu.PlacementTarget = button;
button.ContextMenu.Placement = PlacementMode.Bottom;
if (button.ContextMenu.DataContext == null)
{
button.ContextMenu.SetBinding(FrameworkElement.DataContextProperty, new Binding {Source = button.DataContext});
}
button.ContextMenu.IsOpen = true;
button.ContextMenu.Closed += (_, __) => { button.IsEnabled = true; };
button.IsEnabled = false;
}
}
}