2016-10-31 1 views
1

wpf에서 menuitem에 문제가 있습니다. 내가 가리킬 때 배경색 메뉴 항목을 변경하고 싶습니다. 나는 그것을했다. 그러나 문제는 menuitem의 하위 메뉴가 표시 할 수 없다는 것입니다. 이유를 말해 주시고, 가능한 경우 고칠 수 있도록하십시오. 여기에 감사 내 코드마우스 커서를 가져 가면 배경색이 변경되지만 wpf에서는 하위 메뉴가 표시되지 않습니다.

내 스타일 코드 :

<Style x:Key="BaseStyle" 
     TargetType="MenuItem"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type MenuItem}"> 
       <Border x:Name="Bd" 
         Padding="17,0,17,0" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         SnapsToDevicePixels="True"> 
        <ContentPresenter x:Name="ContentPresenter" 
             Content="{TemplateBinding Header}" 
             Grid.Column="1" 
             ContentSource="Header" 
             RecognizesAccessKey="True" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsHighlighted" 
          Value="True"> 
         <Setter Property="Background" 
           TargetName="Bd" 
           Value="Yellow" /> 
         <Setter Property="BorderBrush" 
           TargetName="Bd" 
           Value="#FF26A0DA" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

그리고 여기가 메뉴 항목입니다 :

<MenuItem Name="menu_file" 
      Header="File" 
      Height="30" 
      Style="{StaticResource BaseStyle}"> 
    <MenuItem Foreground="Black" 
       Header="New Connection" 
       HorizontalAlignment="Left" 
       Width="178" 
       Click="Connection_Click" 
       Margin="0,0,-38,0" /> 
    <MenuItem Foreground="Black" 
       Header="Save" 
       HorizontalAlignment="Left" 
       Width="140" /> 
    <MenuItem Foreground="Black" 
       Header="Print" 
       HorizontalAlignment="Left" 
       Width="140" /> 
    <MenuItem Foreground="Black" 
       Header="Export" 
       HorizontalAlignment="Left" 
       Width="140" /> 
    <Separator Foreground="Black" 
       HorizontalAlignment="Left" 
       Height="1" 
       Width="140" /> 
    <MenuItem Foreground="Black" 
       Header="Assesment" 
       HorizontalAlignment="Left" 
       Width="140" 
       Height="25" 
       Click="Assesment_Click" /> 
</MenuItem> 

답변

2

MenuItem는이 세 별도의 Template, 각 Role에 대한 하나 TopLevelHeader, TopLevelItem , SubmenuHeader. 따라서 원하는 특정 것을 사용자 정의해야합니다. 귀하의 경우에는 TopLevelHeader이됩니다.

템플릿 :

<ControlTemplate x:Key="MenuItemControlTemplate2" TargetType="{x:Type MenuItem}"> 
     <Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
      <Grid VerticalAlignment="Center"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 
       <ContentPresenter x:Name="Icon" Content="{TemplateBinding Icon}" ContentSource="Icon" HorizontalAlignment="Center" Height="16" Margin="3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" Width="16"/> 
       <Path x:Name="GlyphPanel" Data="F1M10,1.2L4.7,9.1 4.5,9.1 0,5.2 1.3,3.5 4.3,6.1 8.3,0 10,1.2z" Fill="{TemplateBinding Foreground}" FlowDirection="LeftToRight" Margin="3" Visibility="Collapsed" VerticalAlignment="Center"/> 
       <ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Grid.Column="1" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       <Popup x:Name="PART_Popup" AllowsTransparency="True" Focusable="False" IsOpen="{Binding IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" Placement="Bottom"> 
        <Border x:Name="SubMenuBorder" BorderBrush="#FF999999" BorderThickness="1" Background="#FFF0F0F0" Padding="2"> 
         <ScrollViewer x:Name="SubMenuScrollViewer" Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}"> 
          <Grid RenderOptions.ClearTypeHint="Enabled"> 
           <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0"> 
            <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=SubMenuBorder}" Height="{Binding ActualHeight, ElementName=SubMenuBorder}" Width="{Binding ActualWidth, ElementName=SubMenuBorder}"/> 
           </Canvas> 
           <Rectangle Fill="#FFD7D7D7" HorizontalAlignment="Left" Margin="29,2,0,2" Width="1"/> 
           <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Cycle" Grid.IsSharedSizeScope="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" KeyboardNavigation.TabNavigation="Cycle"/> 
          </Grid> 
         </ScrollViewer> 
        </Border> 
       </Popup> 
      </Grid> 
     </Border> 
     <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="Yellow"/> 
       <Setter Property="BorderBrush" TargetName="templateRoot" Value="Red"/> 
      </Trigger> 
      <Trigger Property="IsEnabled" Value="False"> 
       <Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="#FF707070"/> 
       <Setter Property="Fill" TargetName="GlyphPanel" Value="#FF707070"/> 
      </Trigger> 
      <Trigger Property="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> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 

그리고 사용자 지정 서식을 적용

XAML :

 <MenuItem Name="menu_file" 
        Header="File" 
        Width="150" 
        Template="{DynamicResource MenuItemControlTemplate2}"> 
      <MenuItem Foreground="Black" 
         Header="New Connection" 
         HorizontalAlignment="Left" 
         Width="178" 
         Margin="0,0,-38,0" /> 
      <MenuItem Foreground="Black" 
         Header="Save" 
         HorizontalAlignment="Left" 
         Width="140" /> 
      <MenuItem Foreground="Black" 
         Header="Print" 
         HorizontalAlignment="Left" 
         Width="140" /> 
      <MenuItem Foreground="Black" 
         Header="Export" 
         HorizontalAlignment="Left" 
         Width="140" /> 
      <Separator Foreground="Black" 
         HorizontalAlignment="Left" 
         Height="1" 
         Width="140" /> 
      <MenuItem Foreground="Black" 
         Header="Assesment" 
         HorizontalAlignment="Left" 
         Width="140" 
         Height="25"/> 
     </MenuItem> 

enter image description here

+0

은 감사하지만 난 어떻게 EDI 수 있습니다 하위 메뉴가있는 t는 항상 메뉴 파일 상위가 남아 있지 않은 상태에서 오른쪽입니다. 고마워요. – jonny

+0

'MenuItem'에'너비'충분 해요. 내 편집 된 게시물을 참조하십시오. – jsanalytics

관련 문제