WPF программно щелкните правой кнопкой мыши внутри класса, полученного из Button - PullRequest
0 голосов
/ 12 мая 2018

У меня есть этот класс:

public class LeftClickButton: Button

public LeftClickButton()
{
  this.Click += LeftClickButton_Click;
}

Я хочу, чтобы функция LeftClickButton_Click вызывала событие правого щелчка на самом LeftClickButton при каждом нажатии левой кнопки.Я безуспешно пробовал следующее:

private void LeftButtonClick_Click(object sender, System.Windows.RoutedEventArgs e)
{
   MouseButtonEventArgs mouseButtonEventArgs = new MouseButtonEventArgs(mouseDevice, 0, MouseButton.Right);
   mouseButtonEventArgs.RoutedEvent = Mouse.MouseUpEvent;
   mouseButtonEventArgs.Source = this;
   this.RaiseEvent(mouseButtonEventArgs);
{

При нажатии левой кнопки вызывает функцию, но ничего не происходит.При щелчке правой кнопкой мыши появляется контекстное меню, и все, что мне нужно, - чтобы щелкнуть левой кнопкой мыши, чтобы появилось контекстное меню.Я думаю, что все, что мне действительно нужно знать, это как вызвать MouseRightButtonUpEvent внутри этой кнопки.Это ускользнуло от меня на добрых два дня.Весьма сбивает с толку все методы, которые я пробовал, и я не буду здесь их перечислять.Вышеприведенный код выглядел наиболее перспективным.

Спасибо!

Определено в словаре ресурсов:

<ContextMenu
   x:Key="MyContextMenu"
   Placement="Bottom"
   Style={StaticResource ContextMenuStyle1}">
   <MenuItem
      Command="{Binding Path=SetStuffCommand}"
      Header="Set Stuff"
      Template="{StaticRsource MenuItemControlTemplate1}"/>
</ContextMenu>

<Style x:Key="MyContextMenuButton" TargetType="{x:Type view:LeftClickButton)">
   <Setter Property="ContextMenuService.Placement" Value="Bottom"/>
   <Setter Property="ContextMenu" Value"{StaticResource MyContextMenu}"/>
</Style>

1 Ответ

0 голосов
/ 16 мая 2018

Хорошо, вот ключевой код для того, что я в итоге сделал.Имейте в виду, я никогда не понимал, как получить тот же самый ответ, через код, из кнопки, как если бы я щелкнул по ней правой кнопкой мыши, но я действительно запустил свое контекстное меню в нужном месте.Я фактически изменил класс на класс, производный от TextBlock, в отличие от Button, и использовал метод PreviewMouseLeftButtonUp вместо метода Click:

public class LeftClickTextBlock : TextBlock
{
    public LeftClickTextBlock()
    {
       this.PreviewMouseLeftButtonUp += this.LeftClickTextBlock_PreviewMouseLeftButtonUp;
    } 

    private void LeftClickTextBlock_PreviewMouseLeftButtonUp(object sender, RoutedEventArgs e)
    {
       LeftClickTextBlock lcb = sender as LeftClickTextBlock;
       ContextMenu contextMenu = lcb.ContextMenu;
       contextMenu.PlacementTarget = lcb;
       contextMenu.Placement = System.Windows.Controls.Primitives.PlacementMode.Bottom;
       contextMenu.IsOpen = true;
    }
}

И затем, конечно, для этого потребовались слегка скорректированные стили:

<Style x:Key="MyContextMenuTextBlock" TargetType="{x:Type view:LeftClickTextBlock)">
   <Setter Property="ContextMenuService.Placement" Value="Bottom"/>
   <Setter Property="ContextMenu" Value"{StaticResource MyContextMenu}"/>
</Style>

Это было в конечном итоге помещено в шаблон данных, который позволяет мне контролировать не только тип контекстного меню, которое появляется при нажатии на отдельный элемент сетки данных, но также и то, какой объект уровня модели представления контекстного менюпункты меню связаны с.Я не буду публиковать здесь весь код, но я думаю о том, чтобы опубликовать его где-нибудь, потому что он действительно дает полный контроль над моделью для каждой ячейки и привязки в сетке данных.

Опять же, определено в ResourceDictionaryили в приложении. xaml:

<DataTemplate DataType={x:Type viewModel:DataItem}>
   <view:LeftClickTextBlock
      Background="Transparent"
      Style="{StaticResource MyContextMenuTextBlock}"
      Text="{Binding Path=DataString, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
...