构建透明WPF菜单和子菜单

时间:2012-01-11 23:07:30

标签: wpf xaml

我要找到我发现的这个很好的例子,它有效,但是当我从其中一个菜单项中获得子菜单分支时,该子菜单上没有呈现样式。

WPF Transparent menu

我尝试将下面的MenuItem.TopLevelHeaderTemplateKey设置为另一个以MenuItem.SubmenuHeaderTemplateKey为目标的ControlTemplate,这在某种程度上有效但子菜单的根与其他没有的菜单项的位置不同子菜单。

有没有办法可以编辑ControlTemplate,它告诉每个菜单项是根或者孩子看起来和行为相同?

ETA:这是我的工作xaml,有项目本身的菜单项被推向左侧。我无法解决原因。

 <ControlTemplate x:Key="{x:Static MenuItem.TopLevelHeaderTemplateKey}" TargetType="{x:Type MenuItem}">
  <Border Name="Border" >
    <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="#9B000000">
                            <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="#C0C0C0"/>
                    <Setter TargetName="Border" Property="BorderBrush" Value="Transparent"/>
                </Trigger>
                <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="True">
                    <Setter TargetName="SubmenuBorder" Property="CornerRadius" Value="0,0,4,4"/>
                    <Setter TargetName="SubmenuBorder" Property="Padding" Value="0,0,0,3"/>
                </Trigger>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Foreground" Value="#888888"/>
                </Trigger>
            </ControlTemplate.Triggers>
    </ControlTemplate>

        <ControlTemplate x:Key="{x:Static MenuItem.SubmenuHeaderTemplateKey}" TargetType="{x:Type MenuItem}">
            <Border Name="Border" >
                <Grid>
      <ContentPresenter 
        Margin="6,3,6,3" 
        ContentSource="Header"                            
        RecognizesAccessKey="True" />
                    <Popup 
      Name="Popup"
      Placement="Right"
      IsOpen="{TemplateBinding IsSubmenuOpen}"
      AllowsTransparency="True" 
      Focusable="False"                           
      PopupAnimation="Fade">
                        <Border 
        Name="SubmenuBorder"
        SnapsToDevicePixels="True"
        Background="#9B000000">
                            <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="#C0C0C0"/>
                    <Setter TargetName="Border" Property="BorderBrush" Value="Transparent"/>
                </Trigger>
                <Trigger SourceName="Popup" Property="Popup.AllowsTransparency" Value="True">
                    <Setter TargetName="SubmenuBorder" Property="CornerRadius" Value="0,0,4,4"/>
                    <Setter TargetName="SubmenuBorder" Property="Padding" Value="0,0,0,3"/>
                </Trigger>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Foreground" Value="#888888"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>

2 个答案:

答案 0 :(得分:0)

我建议你先从整个MenuItem模板示例开始,然后修改它以使其半透明。您可以在msdn网站上找到MenuItem的完整示例代码:http://msdn.microsoft.com/en-us/library/ms747082(v=VS.90).aspx

此代码包含顶级标题,顶级项目,子菜单标题和子菜单项的单独模板。然后它使用触发器包含MenuItem样式中的所有模板。

我认为您最感兴趣的代码是子菜单标题模板。查看此代码,了解如何使子菜单的根看起来与没有子菜单的菜单项相同。如果您还有问题请告诉我。

答案 1 :(得分:0)