Контекстное меню WPF в левом клике
У меня есть приложение WPF. У меня есть элемент управления Image в Xaml-файле.
В правом щелчке этого изображения у меня есть контекстное меню.
Я хотел бы, чтобы они отображались на «Левом щелчке».
- Рекомендации по док-станции WPF
- Проблемы с перезаписью (повторным сохранением) изображения, когда он был установлен как источник изображения
- Как обрабатывать инъекцию зависимостей в приложении WPF / MVVM
- Измените элементы управления WPF из не основного streamа с помощью Dispatcher.Invoke
- WPF перед записью
Как это сделать с помощью MVVM?
- отключить колесо мыши на элементах управления в wpf
- Связывание ComboBox SelectedItem с использованием MVVM
- Как я могу использовать RelayCommand в wpf?
- Используйте StyleSelector для кнопки
- Dispatcher.CurrentDispatcher vs. Application.Current.Dispatcher
- Как получить доступ к элементу управления WPF c # в streamовом безопасном режиме?
- Продолжение задачи в streamе пользовательского интерфейса
- Каков наилучший способ передать событие в ViewModel?
Вот решение 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; }