2016-07-26 2 views
0

WPF에 다중 하위 메뉴가있는 컨텍스트 메뉴가 있습니다. 기본 동작은 항목 아래에있는 메뉴 항목 위로 마우스를 이동하면 하위 메뉴가 열리는 것입니다. 그러나, 나는 그것이 호버에 열리지 않을 것이기 때문에 그것을 바꾸고 싶다. 그러나 왼쪽 클릭에 관해.wpf 컨텍스트 메뉴 클릭시 하위 메뉴 열기

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> 

이것은 처음에는 작동하는 것으로 보입니다. 그러나, 천천히 다른 menuItem 마우스를 이동할 때 잠시 나타납니다 - 'IsMouseOver'사실이 아닌 일부 공간 가능성이 있지만 여전히 하위 메뉴를 보여줍니다.

누군가가 menuItem을 클릭하지 않는 한 어떻게 완전히 억제 할 수 있습니까?

+0

멍청한 질문 - 왜 기본 동작을 변경하고 있습니까? 메뉴는 꽤 널리 이해되고 있습니다. 앱이 다르게 동작하도록함으로써 사용자는 새로운 것을 배워야합니다. – RQDQ

답변

0

동작이 TemplateBinding IsSubmenuOpen에 의해 발생합니다.이 경우 IsOpen이 참으로 설정되고 트리거에서 다시 거짓으로 설정됩니다. 당신은 allready 일을 당신이 단지

IsOpen="False" 

이 문제를가는 또 다른 방법으로 설정할 수 있습니다 클릭 이벤트를 사용하여 유선있어 이후

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

은의의 IsChecked을

IsOpen="{TemplateBinding IsChecked}" 

을 설정하고 설정하는 것입니다 MenuItem이 Clicked 될 때마다 속성.

관련 문제