在上下文菜单中单击子项会触发子项和项目单击事件

时间:2014-07-03 19:07:10

标签: c# wpf contextmenu

我正在尝试为我的menuItem创建一个模板,该模板如下(来自MSDN):

<Style x:Key="StyleContext" TargetType="ContextMenu">
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Grid.IsSharedSizeScope" Value="true"/>
        <Setter Property="HasDropShadow" Value="True"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ContextMenu">
                    <Border 
          Name="Border"
          Background="{StaticResource CouleurFond}"
          BorderBrush="{StaticResource CouleurBouton}"
          BorderThickness="2"
                        Width="Auto" >
                        <StackPanel IsItemsHost="True"
                      KeyboardNavigation.DirectionalNavigation="Cycle"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasDropShadow" Value="true">
                            <Setter TargetName="Border" Property="Padding" Value="0,3,0,3"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="{x:Static MenuItem.SeparatorStyleKey}"
       TargetType="Separator">
        <Setter Property="Height" Value="1"/>
        <Setter Property="Margin" Value="0,4,0,4"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Separator">
                    <Border BorderBrush="{StaticResource CouleurSecondaire}"
                BorderThickness="1"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <!-- TopLevelHeader -->
    <ControlTemplate x:Key="{x:Static MenuItem.TopLevelHeaderTemplateKey}"
                 TargetType="MenuItem">
        <Border Name="Border"  Cursor="Hand">
            <Grid>
                <ContentPresenter 
        Margin="6,3,6,3" 
        ContentSource="Header"
        RecognizesAccessKey="True" />
                <Popup 
        Name="Popup"
        Placement="Bottom"
        IsOpen="{TemplateBinding IsSubmenuOpen}"
        AllowsTransparency="True" 
        Focusable="False"
        PopupAnimation="Fade">
                    <Border 
          Name="SubmenuBorder"
          SnapsToDevicePixels="True"
          Background="{StaticResource CouleurFond}"
          BorderBrush="{StaticResource CouleurBouton}"
          BorderThickness="2" >
                        <StackPanel  
            IsItemsHost="True" 
            KeyboardNavigation.DirectionalNavigation="Cycle" />
                    </Border>
                </Popup>
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsSuspendingPopupAnimation" Value="true">
                <Setter TargetName="Popup" Property="PopupAnimation" Value="None"/>
            </Trigger>
            <Trigger Property="IsHighlighted" Value="true">
                <Setter TargetName="Border" Property="Background"
              Value="{StaticResource CouleurBoutonHover}"/>
                <Setter TargetName="Border" Property="BorderBrush"
              Value="Transparent"/>
                <Setter Property="Foreground" Value="{StaticResource CouleurTexteBoutonHover}"/>
            </Trigger>
            <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="True">
                <Setter TargetName="SubmenuBorder" Property="Padding" Value="0,0,0,3"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    <!-- TopLevelItem -->
    <ControlTemplate 
  x:Key="{x:Static MenuItem.TopLevelItemTemplateKey}" 
  TargetType="MenuItem">

        <Border Name="Border" Cursor="Hand" >
            <Grid>
                <ContentPresenter 
        Margin="6,3,6,3" 
        ContentSource="Header"
        TextBlock.FontFamily="Helvetica"
        TextBlock.Foreground="{TemplateBinding Foreground}"
        RecognizesAccessKey="True" />
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsHighlighted" Value="true">
                <Setter TargetName="Border" Property="Background"
              Value="{StaticResource CouleurBoutonHover}"/>
                <Setter TargetName="Border" Property="BorderBrush" Value="Transparent"/>
                <Setter Property="Foreground"
              Value="{StaticResource CouleurTexteBoutonHover}"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Foreground"
              Value="{StaticResource CouleurTexteBoutonDisabled}"/>
                <Setter TargetName="Border" Property="Background" Value="{StaticResource CouleurBoutonDisabled}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    <!-- SubmenuItem 
    -->

    <ControlTemplate 
        x:Key="{x:Static MenuItem.SubmenuItemTemplateKey}"
        TargetType="MenuItem"
        >
        <Border 
            Name="Border"
          BorderBrush="{StaticResource CouleurBouton}"
          Background="{StaticResource CouleurFond}"
          BorderThickness="0" Cursor="Hand">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="Icon"/>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" SharedSizeGroup="Shortcut"/>
                    <ColumnDefinition Width="13"/>
                </Grid.ColumnDefinitions>
                <ContentPresenter 
        Name="Icon"
        Margin="6,0,6,0"
        VerticalAlignment="Center"
        ContentSource="Icon"/>
                <Border 
        Name="Check"  
        Width="13" Height="13" 
        Visibility="Collapsed"
        Margin="6,0,6,0" 
        Background="{StaticResource CouleurFond}"
        BorderThickness="2"
        BorderBrush="{StaticResource CouleurBouton}">
                    <Path 
          Name="CheckMark"
          Width="7" Height="7" 
          Visibility="Hidden" 
          SnapsToDevicePixels="False" 
          Stroke="{StaticResource CouleurSecondaire}"
          StrokeThickness="2"
          Data="M 0 0 L 7 7 M 0 7 L 7 0" />
                </Border>
                <ContentPresenter 
        Name="HeaderHost"
        Grid.Column="1"
        ContentSource="Header"
        RecognizesAccessKey="True"/>
                <TextBlock x:Name="InputGestureText"
        Grid.Column="2"
        Foreground="{StaticResource CouleurTexte}"
        Text="{TemplateBinding InputGestureText}"
        Margin="5,2,0,2"
        DockPanel.Dock="Right" />
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="Icon" Value="{x:Null}">
                <Setter TargetName="Icon" Property="Visibility" Value="Hidden"/>
            </Trigger>
            <Trigger Property="IsChecked" Value="true">
                <Setter TargetName="CheckMark" Property="Visibility" Value="Visible"/>
            </Trigger>
            <Trigger Property="IsCheckable" Value="true">
                <Setter TargetName="Check" Property="Visibility" Value="Visible"/>
                <Setter TargetName="Icon" Property="Visibility" Value="Hidden"/>
            </Trigger>
            <Trigger Property="IsHighlighted" Value="true">
                <Setter TargetName="Border" Property="Background"
              Value="{StaticResource CouleurBoutonHover}"/>
                <Setter TargetName="InputGestureText" Property="Foreground"
              Value="{StaticResource CouleurTexteBoutonHover}"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
                <Setter TargetName="InputGestureText" Property="Foreground" Value="{StaticResource CouleurTexteBoutonDisabled}"/>
                <Setter TargetName="Border" Property="Background" Value="{StaticResource CouleurBoutonDisabled}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

    <!-- SubmenuHeader -->
    <ControlTemplate 
  x:Key="{x:Static MenuItem.SubmenuHeaderTemplateKey}" 
  TargetType="MenuItem">
        <Border Name="Border" 
          BorderBrush="{StaticResource CouleurBouton}"
          Background="{StaticResource CouleurFond}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="Icon"/>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" SharedSizeGroup="Shortcut"/>
                    <ColumnDefinition Width="13"/>
                </Grid.ColumnDefinitions>
                <ContentPresenter 
        Name="Icon"
        Margin="6,0,6,0"
        VerticalAlignment="Center"
        ContentSource="Icon"/>
                <ContentPresenter 
        Name="HeaderHost"
        Grid.Column="1"
        ContentSource="Header"
        RecognizesAccessKey="True"/>
                <TextBlock x:Name="InputGestureText"
        Grid.Column="2"
        Text="{TemplateBinding InputGestureText}"
                           Foreground="{StaticResource CouleurTexte}"
        Margin="5,2,2,2"
        DockPanel.Dock="Right"/>
                <Path 
        Grid.Column="3"
        HorizontalAlignment="Center"
        VerticalAlignment="Center"
        Data="M 0 0 L 0 7 L 4 3.5 Z" 
        Fill="{StaticResource CouleurSecondaire}" />
                <Popup 
        Name="Popup"
        Placement="Right"
        HorizontalOffset="3" 
        IsOpen="{TemplateBinding IsSubmenuOpen}"
        AllowsTransparency="True" 
        Focusable="False"
        PopupAnimation="Fade">
                    <Border 
          Name="SubmenuBorder"
          SnapsToDevicePixels="True"
          Background="{StaticResource CouleurFond}"
          BorderBrush="{StaticResource CouleurBouton}"
          BorderThickness="1" >
                        <StackPanel  
            IsItemsHost="True" 
            KeyboardNavigation.DirectionalNavigation="Cycle" />
                    </Border>
                </Popup>
            </Grid>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="Icon" Value="{x:Null}">
                <Setter TargetName="Icon" Property="Visibility" Value="Collapsed"/>
            </Trigger>
            <Trigger Property="IsHighlighted" Value="true">
                <Setter TargetName="Border" Property="Background"
              Value="{StaticResource CouleurBoutonHover}"/>
                <Setter TargetName="InputGestureText" Property="Foreground" Value="{StaticResource CouleurTexteBoutonHover}"/>
            </Trigger>
            <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="True">
                <Setter TargetName="SubmenuBorder" Property="CornerRadius" Value="0"/>
                <Setter TargetName="SubmenuBorder" Property="Padding" Value="0,3,0,3"/>
            </Trigger>
            <Trigger Property="IsEnabled" Value="false">
                <Setter TargetName="InputGestureText" Property="Foreground" Value="{StaticResource CouleurTexteBoutonDisabled}"/>
                <Setter TargetName="Border" Property="Background" Value="{StaticResource CouleurBoutonDisabled}"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
    <!-- MenuItem Style -->
    <Style x:Key="MenuItemStyle" TargetType="MenuItem">
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="Opacity" Value="0.95" />
        <Style.Triggers>
            <Trigger Property="Role" Value="TopLevelHeader">
                <Setter Property="Template"
              Value="{StaticResource {x:Static MenuItem.TopLevelHeaderTemplateKey}}"/>
                <Setter Property="Grid.IsSharedSizeScope" Value="true"/>
            </Trigger>
            <Trigger Property="Role" Value="TopLevelItem">
                <Setter Property="Template"
              Value="{StaticResource {x:Static MenuItem.TopLevelItemTemplateKey}}"/>
            </Trigger>
            <Trigger Property="Role" Value="SubmenuHeader">
                <Setter Property="Template"
              Value="{StaticResource {x:Static MenuItem.SubmenuHeaderTemplateKey}}"/>
            </Trigger>
            <Trigger Property="Role" Value="SubmenuItem">
                <Setter Property="Template"
              Value="{StaticResource {x:Static MenuItem.SubmenuItemTemplateKey}}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
    <!-- Design des contextmenu-->

在我的代码中:

MenuItem mySubItem = new MenuItem() { Header = "SubItem" };
                mySubItem .Style = (Style)this.FindResource("MenuItemStyle");
mySubItem.Click += mySubItem _Click;

                MenuItem m2 = new MenuItem();
                m2.Header = LibLOCA.Localisation.GetStringFromResources("OPTION_MENU");
                m2.Style = (Style)this.FindResource("MenuItemStyle");
m2.Click += m2_Click;
               m2.Items.Add(mySubItem );
contextMenu.Items.Add(m2);

ContextMenu看起来没问题,我可以点击两个menuItems,但如果我点击subItem: 应用程序将调用“mySubItem_click”,然后它也将调用“m2_click”。

为什么“m2_click”被调用,即使我没有点击与之关联的菜单项?

我的模板或代码是否有问题?

谢谢:)

1 个答案:

答案 0 :(得分:2)

您必须处理subitem,以便它不会将事件冒泡到Parent菜单项。

在点击事件处理程序

RoutedEventArgs有一个名为Handled的属性,将其设为 true