2015-06-16 4 views
0

У меня небольшая проблема с ContextMenu.WPF Button с ContextMenu под левым кликом

<Window.Resources> 
    <Style x:Key="ButtonWithContextMenuStyle" TargetType="Button"> 
     <Setter Property="Background" Value="#cbeb00" /> 
     <Setter Property="Foreground" Value="#505050" /> 
     <Setter Property="FontSize" Value="12" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Button"> 
        <Border CornerRadius="4" Background="{TemplateBinding Background}" 
          BorderThickness="0"> 
         <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="{TemplateBinding Padding}" /> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Background" Value="#aaaaaa"/> 
          <Setter Property="Foreground" Value="#dcff00"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="ContextMenu"> 
      <Setter.Value> 
       <ContextMenu> 
        <MenuItem Command="{Binding EditUserCommand}" Header="{DynamicResource EditUserContextMenuMW}"/> 
        <MenuItem Command="{Binding OpenHistoryCommand}" Header="{DynamicResource ConversationHistoryContextMenuMW}"/> 
        <MenuItem Command="{Binding OpenHistoryCommand}" Header="{DynamicResource BuyCreditContextMenuMW}"/> 
        <Separator /> 
        <MenuItem Command="{Binding LogoutCommand}" Header="{DynamicResource LogoutContextMenuMW}"/> 
       </ContextMenu> 
      </Setter.Value> 
     </Setter> 
     <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> 
    </Style> 
</Window.Resources> 

Когда я нажимаю правую кнопку мыши, все работает правильно. ContextMenu открывается, и я могу вызвать команду в MenuItem.

Я хотел бы видеть такое же поведение, когда я нажимаю левую кнопку мыши. Однако открывается только ContextMenu, и я не могу вызвать команду.

Может кто-нибудь сказать мне, что я делаю неправильно?

+0

Проблема заключается в том, что контекстное меню не в том же дереве визуалов, что и его цель размещения: http://stackoverflow.com/a/21356695/5147720 – Jose

ответ

-2

Вам необходимо использовать маршрутизируемое событие MouseRightButtonDown.

<EventTrigger RoutedEvent="MouseRightButtonDown"> 
+0

Это решение дает мне право на кнопку мыши, даже если я использую MouseLeftButtonDown, это будет работать неправильно. –

0
<Window x:Class="ContextMenuMouseDownStack.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<StackPanel Margin="10"> 
    <StackPanel.Resources> 
     <Style TargetType="Button"> 
      <Style.Triggers> 
       <EventTrigger RoutedEvent="Click"> 
        <EventTrigger.Actions> 
         <BeginStoryboard> 
          <Storyboard> 
           <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="ContextMenu.IsOpen"> 
            <DiscreteBooleanKeyFrame KeyTime="0:0:2" Value="True"/> 
           </BooleanAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger.Actions> 
       </EventTrigger> 
      </Style.Triggers> 
     </Style> 
    </StackPanel.Resources> 
    <Button Content="Click!" VerticalAlignment="Center" HorizontalAlignment="Center"> 
     <Button.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Menu item 1" Click="MenuItem_Click"/> 
       <MenuItem Header="Menu item 2" /> 
       <Separator /> 
       <MenuItem Header="Menu item 3" /> 
      </ContextMenu> 
     </Button.ContextMenu> 
    </Button> 
</StackPanel> 

В этом примере, который напоминает ваш, замковое событие делает работу, как это должно быть. В самом деле, у меня нет команды там, кроме простого кода за обработчиком. Он достигает его в обоих направлениях, правой или левой кнопкой мыши. Просто для тестирования, можете ли вы попробовать простой обработчик?

Update 1:

Он также работает в обоих направлениях для меня:

<EventTrigger RoutedEvent="PreviewMouseDown"> 

Update 2

кажется, что ваш Раскадровка губит вещи:

Я изменил это с помощью всплывающего окна:

<Popup x:Name="btnMenuPopup" Placement="Mouse" StaysOpen="False"> 
     <Border BorderBrush="Black" BorderThickness="2" CornerRadius="2"> 
      <Menu> 
       <MenuItem Header="Menu item 1" Command="{Binding EditCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/> 
       <MenuItem Header="Menu item 2" /> 
       <Separator /> 
       <MenuItem Header="Menu item 3" /> 
       <Menu.ItemsPanel> 
        <ItemsPanelTemplate> 
         <VirtualizingStackPanel Orientation="Vertical"/> 
        </ItemsPanelTemplate> 
       </Menu.ItemsPanel> 
      </Menu> 
     </Border> 
    </Popup> 

Чтобы это было быстро, я добавил событие щелчка на кнопке, которая откроет всплывающее окно.

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    btnMenuPopup.IsOpen = true; 
} 

И теперь это должно сработать.

Вот команда для Popup: осуществление

Command="{Binding CommandShowPopup}" CommandParameter="{Binding ElementName=btnMenuPopup}" 

Команда:

public class CommandShowPopup : ICommand 
{ 
    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     (parameter as Popup).IsOpen = true; 
    } 
} 
+0

Оба решения отлично работают с событиями, и я пытаюсь это сделать до того, как я опубликую «стек», но я не могу вызвать команду Command.I не знаю почему, потому что в этом окне я использую команды, и все работает нормально (за исключением этого, конечно). –