如何为MenuItem显示箭头?

问题描述 投票:0回答:1

我正在研究/学习 WPF 以与 PowerShell 一起使用。我需要一个自定义的 MenuItem,我设法想出了下面的代码。代码运行良好,保留了传统 MenuItem 的所有功能,无需自定义,但到目前为止,我还无法添加当项目(父项目除外)有子菜单时显示箭头的功能。

In summary

我有这个:

I have this

我需要添加这个:

I need to add this

代码:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Project"
    Width="400" Height="520"
    ResizeMode="CanMinimize"
    WindowStartupLocation="CenterScreen"
    Background="#191919">

<Window.Resources>

    <Style TargetType="MenuItem">
        <Setter Property="Foreground" Value="#E6E6E6"/>
        <Setter Property="Background" Value="#4C4C4C"/>
        <Setter Property="Padding" Value="3"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="MenuItem">
                    <Grid Background="{TemplateBinding Background}">
                        <Border x:Name="Border" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
                            <TextBlock x:Name="MenuItemText" 
                                       Text="{Binding Path=Header, RelativeSource={RelativeSource TemplatedParent}}"
                                       HorizontalAlignment="Left" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}"/>
                        </Border>

                        <Popup x:Name="SubMenuPopup" IsOpen="{TemplateBinding IsSubmenuOpen}" Placement="Right">
                            <Grid Background="{TemplateBinding Background}">
                                <ItemsPresenter/>
                            </Grid>
                        </Popup>
                    </Grid>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSubmenuOpen" Value="True">
                            <Setter TargetName="MenuItemText" Property="Foreground" Value="#E6E6E6"/>
                            <Setter TargetName="Border" Property="Background" Value="#2B2B2B"/>
                        </Trigger>

                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="MenuItemText" Property="Foreground" Value="#2B2B2B"/>
                            <Setter TargetName="Border" Property="Background" Value="#E6E6E6"/>
                        </Trigger>

                        <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="MenuItemText" Property="Foreground" Value="#7F7F7F"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</Window.Resources>

    <Grid>

        <Menu HorizontalAlignment="Right" VerticalAlignment="Bottom">
            <MenuItem Header="  Apoiar  "/>
            <MenuItem Header="  Sobre  ">
                <MenuItem Header="EmLogs"/>
                <MenuItem Header="Licenças de Terceiros">
                    <MenuItem Header="BrowserDownloadsView"/>
                    <MenuItem Header="BrowsingHistoryView"/>
                    <MenuItem Header="CSVFileView"/>
                    <MenuItem Header="Everything"/>
                    <MenuItem Header="ExecutedProgramsList"/>
                    <MenuItem Header="InstalledDriversList"/>
                    <MenuItem Header="LastActivityView"/>
                    <MenuItem Header="ProcessExplorer" IsEnabled="False"/>
                    <MenuItem Header="RegScanner"/>
                    <MenuItem Header="ShellBagsView"/>
                    <MenuItem Header="System Informer">
                        <MenuItem Header="Licença"/>
                        <MenuItem Header="Licenças de Terceiros"/>
                    </MenuItem>
                    <MenuItem Header="TaskSchedulerView"/>
                    <MenuItem Header="WebBrowserBookmarksView"/>
                    <MenuItem Header="WhatInStartup"/>
                    <MenuItem Header="WinDefLogView"/>
                </MenuItem>
            </MenuItem>
        </Menu>

    </Grid>

</Window>
wpf menuitem
1个回答
0
投票

我尝试过这个,它对我有用:

        <Style TargetType="MenuItem">
            <Setter Property="Foreground" Value="#E6E6E6"/>
            <Setter Property="Background" Value="#4C4C4C"/>
            <Setter Property="Padding" Value="3"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="MenuItem">
                        <Grid Background="{TemplateBinding Background}" MinWidth="150">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*" />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>

                            
                            <TextBlock x:Name="MenuItemText"
                                       Text="{Binding Path=Header, RelativeSource={RelativeSource TemplatedParent}}"
                                       HorizontalAlignment="Left" VerticalAlignment="Center"
                                       Foreground="{TemplateBinding Foreground}" Grid.Column="0"/>

                            
                            <Path x:Name="Arrow" Data="M 0 0 L 4 4 L 0 8 Z" Fill="{TemplateBinding Foreground}"
                                  HorizontalAlignment="Center" VerticalAlignment="Center"
                                  Visibility="Collapsed" Grid.Column="1" />

                            
                            <Popup x:Name="SubMenuPopup" IsOpen="{TemplateBinding IsSubmenuOpen}" Placement="Right">
                                <Grid Background="{TemplateBinding Background}">
                                    <ItemsPresenter/>
                                </Grid>
                            </Popup>
                        </Grid>

                        <ControlTemplate.Triggers>
                            <!-- Trigger: Arrow just for child items -->
                            <Trigger Property="HasItems" Value="True">
                                <Setter TargetName="Arrow" Property="Visibility" Value="Visible"/>
                            </Trigger>
                            <Trigger Property="HasItems" Value="False">
                                <Setter TargetName="Arrow" Property="Visibility" Value="Collapsed"/>
                            </Trigger>
                            <!-- Trigger: Hide arrow at parents -->
                            <Trigger Property="Role" Value="TopLevelHeader">
                                <Setter TargetName="Arrow" Property="Visibility" Value="Collapsed"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.