【转】WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu

本文详细介绍了如何在WPF中自定义Menu的样式,包括MenuItem的图标、选中状态和快捷键等。接着展示了如何定制ContextMenu的样式,特别是实现文本操作的剪切、复制、粘贴功能。最后,文章阐述了TreeView的基本样式设置,以及如何添加右键菜单功能,支持层级关系和大数据虚拟化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.前言

  申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等。

  本文主要内容:

  • 菜单Menu的自定义样式;
  • 右键菜单ContextMenu的自定义样式;
  • 树控件TreeView的自定义样式,及右键菜单实现。

二.菜单Menu的自定义样式

  自定义菜单样式的效果图:

  Menu和ContextMenu样式本身很简单,他们最主要的部分就是MenuItem,MenuItem中包含的内容比较多,如图标、选中状态、二级菜单、二级菜单的指针、快捷键等。 使用了字体图标定义菜单项MenuItem样式代码:  

<!--菜单项MenuItem样式FIconMenuItem-->
    <Style x:Key="FIconMenuItem" TargetType="{x:Type MenuItem}">
        <Setter Property="BorderBrush" Value="{
    
    StaticResource MenuBorderBrush}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Background" Value="{
    
    StaticResource MenuBackground}"/>
        <Setter Property="Foreground" Value="{
    
    StaticResource MenuForeground}"/>
        <Setter Property="FontSize" Value="{
    
    StaticResource FontSize}"/>
        <Setter Property="Height" Value="28"/>
        <Setter Property="Width" Value="Auto"/>
        <Setter Property="Margin" Value="1"/>
        <Setter Property="local:ControlAttachProperty.FIconSize" Value="22"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{
    
    x:Type MenuItem}">
                    <!--Item-->
                    <Border  x:Name="border" Background="Transparent" Height="{
    
    TemplateBinding Height}" Opacity="1">
                        <Grid  VerticalAlignment="Center" Margin="{
    
    TemplateBinding Margin}">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition x:Name="icon_col" MaxWidth="35" SharedSizeGroup="MenuItemIconColumnGroup"/>
                                <ColumnDefinition Width="Auto" SharedSizeGroup="MenuTextColumnGroup"/>
                                <ColumnDefinition Width="Auto" SharedSizeGroup="MenuItemIGTColumnGroup"/>
                                <ColumnDefinition Width="16" x:Name="arrow_col" SharedSizeGroup="MenumItemArrow"/>
                            </Grid.ColumnDefinitions>
                            <!--icon-->
                            <TextBlock x:Name="PART_Icon" Text="{
    
    TemplateBinding Icon}" Foreground="{
    
    TemplateBinding Foreground}" Margin="5,1,1,1"
                                       FontSize="{
    
    TemplateBinding local:ControlAttachProperty.FIconSize}" Style="{
    
    StaticResource FIcon}"/>
                            <!--Header-->
                            <ContentPresenter Grid.Column="1" x:Name="txtHeader" Margin="3,1,5,1" MinWidth="90"
                                          RecognizesAccessKey="True" VerticalAlignment="Center" ContentSource="Header"/>
                            <!--快捷键 InputGestureText 暂不支持你了 -->
                            <TextBlock Grid.Column="2" Margin="3,1,3,1" x:Name="IGTHost" Text="{
    
    TemplateBinding InputGestureText}" 
                                       FontSize="{
    
    TemplateBinding FontSize}"
                                       VerticalAlignment="Center" Visibility="Visible" Foreground="{
    
    TemplateBinding Foreground}" />
                            <!--右指针-->
                            <TextBlock x:Name="PART_Arrow" Grid.Column="3" Text="&#xe605;" Foreground="{
    
    TemplateBinding Foreground}" 
                                       FontSize="14" Style="{
    
    StaticResource FIcon}"/>
                            <!--淡出子集菜单容器-->
                            <Popup x:Name="SubMenuPopup" AllowsTransparency="true" IsOpen="{
    
    Binding IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}" 
                                        Placement="Bottom"  Focusable="false" VerticalOffset="0"
                                   PopupAnimation="{
    
    DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}">
                                <Border Background="{
    
    TemplateBinding Background}"  CornerRadius="0" Margin="5" Effect="{
    
    StaticResource DefaultDropShadow}"
                                                BorderBrush="{
    
    TemplateBinding BorderBrush}" BorderThickness="{
    
    TemplateBinding BorderThickness}">
                                    <Grid x:Name="SubMenu" Grid.IsSharedSizeScope="True">
                                        <StackPanel Margin="0" IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Cycle"/>
                                    </Grid>
                                </Border>
                            </Popup>
                        </Grid>
                    </Border>
                    <!--触发器-->
                    <ControlTemplate.Triggers>
                        <!--TopLevelHeader:第一级菜单(有子菜单)-->
                        <Trigger Property="Role" Value="TopLevelHeader">
                            <Setter Property="Visibility" Value="Collapsed" TargetName="PART_Arrow"/>
                            <Setter Property="Visibility" Value="Collapsed" TargetName="IGTHost"/>
                            <Setter Property="Margin" Value="5,1,1,1" TargetName="PART_Icon"/>
                            <Setter Property="Margin" Value="1,1,6,1" TargetName="txtHeader"/>
                            <Setter Property="MinWidth" Value="10" TargetName="txtHeader"/>
                            <Setter Property="Width" Value="0" TargetName="arrow_col"/>
                        </Trigger>
                        <!--TopLevelItem 第一级菜单(无子级)-->
                        <Trigger Property="Role" Value="TopLevelItem">
                            <Setter Property="Visibility" Value="Collapsed" TargetName="PART_Arrow"/>
                            <Setter Property="Visibility" Value="Collapsed" TargetName="IGTHost"/>
                            <Setter Property="Margin" Value="5,1,1,1" TargetName="PART_Icon"/>
                            <Setter Property="Margin" Value="1,1,6,1" TargetName="txtHeader"/>
                            <Setter Property="MinWidth" Value="10" TargetName="txtHeader"/>
                            <Setter Property="Width" Value="0" TargetName="arrow_col"/>
                        <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值