Контекстное меню WPF в левом клике

У меня есть приложение WPF. У меня есть элемент управления Image в Xaml-файле.

В правом щелчке этого изображения у меня есть контекстное меню.

Я хотел бы, чтобы они отображались на «Левом щелчке».

Как это сделать с помощью MVVM?

Вот решение XAML. Просто добавьте этот стиль в свою кнопку. Это приведет к тому, что контекстное меню будет открыто как с левого, так и с правого щелчка. Наслаждайтесь!

 

Вы можете сделать это, используя событие MouseDown для изображения, подобное этому

         

А затем покажите ContextMenu в EventHandler в коде

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

Вы можете придумать свой собственный DependencyProperty, который открывает контекстное меню при щелчке по изображению, например:

   ...   

И вот код C # для этого свойства:

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

вам нужно только добавить код в функцию Image_MouseDown

e.Handled = true;

Тогда он не исчезнет.

Если вы хотите сделать это только в Xaml без использования кода, вы можете использовать триггеры Expression Blend:

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

вы можете привязать свойство Isopen контекстаMenu к свойству в вашем представленииModel как «IsContextMenuOpen». но проблема заключается в том, что вы не можете напрямую связать контекстное меню с вашим модулем viewModel, потому что оно не является частью вашего hiarchy userControl. Чтобы разрешить это, вы должны привязать свойство тега к textontext вашего представления.

   .....   

Удачи.

Эй, я столкнулся с той же проблемой, которая искала решение, которого я не нашел здесь.

Я ничего не знаю о MVVM, поэтому, вероятно, это не MVVM, но это сработало для меня.

Шаг 1. Дайте вашему контекстному меню имя.

    

Шаг 2: Дважды щелкните объект управления и вставьте этот код. Вопросы для заказа!

 Private Sub Button_Click_1(sender As Object, e As Windows.RoutedEventArgs) cmTabs.StaysOpen = True cmTabs.IsOpen = True End Sub 

Шаг 3: Наслаждайтесь

Это будет реагировать на левый и правый щелчок. Это кнопка с ImageBrush с ControlTemplate.

XAML

   

C #

  private void be_Click(object sender, RoutedEventArgs e) { b.ContextMenu.DataContext = b.DataContext; b.ContextMenu.IsOpen = true; } 
  • Измените WPF DataTemplate для элемента ListBox, если он выбран
  • Как отобразить текст по умолчанию «--Select Team -» в поле со списком в pageload в WPF?
  • Значение * (звездочка) в WPF ColumnDefinition?
  • Как обновить ObservableCollection с помощью рабочего streamа?
  • Создание экземпляра вложенного classа в XAML
  • Связывание только части свойства margin элемента управления WPF
  • Связывание данных в пользовательских элементах WPF
  • WPF: слайдер с событием, которое запускается после того, как пользователь перетаскивает
  • Как создать окно WPF без frameworks, которая может быть изменена только с помощью захвата?
  • Конвертер связыванияПараметр
  • DataTrigger не изменяет свойство Text
  • Interesting Posts

    Как преобразовать целое число в его словесное представление?

    ASP.NET MVC. Потенциально опасное значение Request.Form было обнаружено у клиента при использовании настраиваемого модуля-шаблона

    Создание массива из текстового файла в Bash

    Функция «Удалить дубликаты» не удаляет все дубликаты

    Получить перечисление по его внутреннему полю

    Эквивалент VB.NET для C # ‘dynamic’ с опцией Strict On

    Django rest framework, используйте разные сериализаторы в том же ModelViewSet

    Служба WAMP MySQL не запускается

    Как сделать это ослепительно очевидным, какое окно активно

    Как переопределить применение в компаньоне classа case

    Проверьте, является ли число целым

    CUPS: создание фиктивного принтера, направляющего dev / null

    Экспортировать виртуальный бокс VDI в жесткий диск для загрузки его изначально

    Получение шаблонов / файлов Facelets из внешней файловой системы или базы данных

    curl: (60) SSL-сертификат: не удалось получить сертификат локального эмитента

    Давайте будем гением компьютера.