2016-07-26 103 views
0

我在WPF中有一个contextmenu和多个子菜单。默认行为是,如果您将鼠标悬停在项目下方的菜单项上,它将打开子菜单。不过,我想改变它,所以它不会在悬停时打开,但只需左键单击即可。wpf contextmenu点击打开子菜单

我做了一个MenuItem的默认模板的副本。在这里,我做了一些改变:

<ControlTemplate x:Key="{ComponentResourceKey ResourceId=SubmenuHeaderTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}" TargetType="{x:Type MenuItem}"> 
    <!-- some default template code --> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsSuspendingPopupAnimation" Value="true"> 
      <Setter Property="PopupAnimation" TargetName="PART_Popup" Value="None"/> 
     </Trigger> 
     <Trigger Property="Icon" Value="{x:Null}"> 
      <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> 
     </Trigger> 
     <Trigger Property="IsChecked" Value="True"> 
      <Setter Property="Visibility" TargetName="GlyphPanel" Value="Visible"/> 
      <Setter Property="Visibility" TargetName="Icon" Value="Collapsed"/> 
     </Trigger> 
     <Trigger Property="IsHighlighted" Value="True"> 
      <Setter Property="Background" TargetName="templateRoot" Value="Transparent"/> 
      <Setter Property="BorderBrush" TargetName="templateRoot" Value="{StaticResource MenuItem.Highlight.Border}"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="{StaticResource Menu.Disabled.Foreground}"/> 
      <Setter Property="Fill" TargetName="Glyph" Value="{StaticResource Menu.Disabled.Foreground}"/> 
      <Setter Property="Fill" TargetName="RightArrow" Value="{StaticResource Menu.Disabled.Foreground}"/> 
     </Trigger> 
     <Trigger Property="ScrollViewer.CanContentScroll" SourceName="SubMenuScrollViewer" Value="false"> 
      <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=SubMenuScrollViewer}"/> 
      <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=SubMenuScrollViewer}"/> 
     </Trigger> 

     <!-- my code to supress the opening of the submenu in mouseover --> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="IsOpen" TargetName="PART_Popup" Value="False"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

这似乎起初工作。但是,当我慢慢地将鼠标移动到另一个菜单项时,它会显示一会儿 - 可能是'IsMouseOver'不是真的一些空间,但子菜单仍然显示。

我怎样才能完全抑制它 - 除非有人点击menuItem?

+0

愚蠢的问题 - 为什么你要改变默认行为?菜单被广泛理解为...通过让您的应用程序行为不同,用户必须学习新的东西。 – RQDQ

回答

0

该行为是由TemplateBinding IsSubmenuOpen引起的,它会在触发器将其设置回False之前自动将IsOpen设置为True。

<Popup 
    Name="PART_Popup" 
    Placement="Right" 
    HorizontalOffset="-4" 
    IsOpen="{TemplateBinding IsSubmenuOpen}" 
    AllowsTransparency="True" 
    Focusable="False" 
    PopupAnimation="Fade"> 
    <Border 
     ... 
    </Border> 
</Popup> 

既然你媒体链接得到使用,你可以只设置

IsOpen="False" 

的解决这个打算另一种方式click事件有线的东西,是设置

IsOpen="{TemplateBinding IsChecked}" 

和设置器isChecked每次MenuItem被点击时的属性。