C#实现Menu和ContextMenu自定义风格及contextMenu自定义

作者:tancfeng 时间:2022-01-03 04:09:30 

为了实现自定义的Menu和ContextMenu效果,下面演示代码通过派生ProfessionalColorTable类,在自定义的类中重写ProfessionalColorTable类的相关联的属性,从而实现自定义菜单效果。


using System.Drawing;
using System.Windows.Forms;
public class CustomToolStripColorTable : ProfessionalColorTable
{
 /// <summary>
 /// 主菜单项被点击后,展开的下拉菜单面板的边框
 /// </summary>
 public override Color MenuBorder
 {
   get
   {
     return Color.FromArgb(37, 37, 37);
   }
 }
 /// <summary>
 /// 鼠标移动到菜单项(主菜单及下拉菜单)时,下拉菜单项的边框
 /// </summary>
 public override Color MenuItemBorder
 {
   get
   {
     return Color.Transparent;
   }
 }
 #region 顶级菜单被选中背景颜色
 public override Color MenuItemSelectedGradientBegin
 {
   get
   {
     return Color.FromArgb(37, 37, 37);
   }
 }
 public override Color MenuItemSelectedGradientEnd
 {
   get
   {
     return Color.FromArgb(37, 37, 37);
   }
 }
 #endregion
 #region 顶级菜单被按下是,菜单项背景色
 public override Color MenuItemPressedGradientBegin
 {
   get
   {
     return Color.Black;
   }
 }
 public override Color MenuItemPressedGradientMiddle
 {
   get
   {
     return Color.FromArgb(37, 37, 37);
   }
 }
 public override Color MenuItemPressedGradientEnd
 {
   get
   {
     return Color.Black;
   }
 }
 #endregion
 /// <summary>
 /// 菜单项被选中时的颜色
 /// </summary>
 public override Color MenuItemSelected
 {
   get
   {
     return Color.FromArgb(37, 37, 37);
   }
 }
 #region 下拉菜单面板背景设置(不包括下拉菜单项)
 //下拉菜单面板背景一共分为2个部分,左边为图像区域,右侧为文本区域,需要分别设置
 //ToolStripDropDownBackground设置文本部分的背景色
 public override Color ToolStripDropDownBackground
 {
   get
   {
     return Color.Black;
   }
 }
 //以ImageMarginGradient开头的3个设置的是图像部分的背景色,begin->end是从左到右的顺序
 public override Color ImageMarginGradientBegin
 {
   get
   {
     return Color.Black;
   }
 }
 public override Color ImageMarginGradientMiddle
 {
   get
   {
     return Color.Black;
   }
 }
 public override Color ImageMarginGradientEnd
 {
   get
   {
     return Color.Black;
   }
 }
 #endregion
}

然后对需要实现自定义风格的菜单(如:contextMenuStrip1)应用如下代码:


contextMenuStrip1.RenderMode = ToolStripRenderMode.Professional;
contextMenuStrip1.Renderer = new ToolStripProfessionalRenderer(new CustomToolStripColorTable());

ContextMenu的自定义

1.针对整个ContextMenu, 自定义一个Style,去掉竖分割线


<Style x:Key="DataGridColumnsHeaderContextMenuStyle" TargetType="{x:Type ContextMenu}">
       <Setter Property="SnapsToDevicePixels" Value="True"/>
       <Setter Property="Grid.IsSharedSizeScope" Value="true"/>
       <Setter Property="HasDropShadow" Value="True"/>
       <Setter Property="Template">
         <Setter.Value>
           <ControlTemplate TargetType="{x:Type ContextMenu}">
             <Border Uid="Border_93">
               <Border.Style>
                 <Style TargetType="{x:Type Border}">
                   <Setter Property="Tag" Value="{DynamicResource {x:Static SystemParameters.DropShadowKey}}"/>
                   <Style.Triggers>
                     <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True">
                       <Setter Property="Effect">
                         <Setter.Value>
                           <DropShadowEffect BlurRadius="4" Opacity="0.8" ShadowDepth="1"/>
                         </Setter.Value>
                       </Setter>
                     </DataTrigger>
                   </Style.Triggers>
                 </Style>
               </Border.Style>
               <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Uid="Border_50">
                 <ScrollViewer CanContentScroll="True" Uid="ScrollViewer_9"
             Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}">
                   <ItemsPresenter KeyboardNavigation.DirectionalNavigation="Cycle" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Uid="ItemsPresenter_5"/>
                 </ScrollViewer>
               </Border>
             </Border>
           </ControlTemplate>
         </Setter.Value>
       </Setter>
     </Style>

2. 针对其中的ItemContainerStyle来写个MenuItem的control template


<Style x:Key="MenuItemStyle1" TargetType="{x:Type MenuItem}"> <Setter Property="Template" Value="{DynamicResource MenuItemControlTemplate1}"/> <Setter Property="Margin" Value="0"></Setter> <Setter Property="Padding" Value="0"></Setter> </Style> <ControlTemplate x:Key="MenuItemControlTemplate1" TargetType="{x:Type MenuItem}"> <Grid x:Name="grid" SnapsToDevicePixels="True" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" > <ContentPresenter ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Grid.Column="0" ContentStringFormat="{TemplateBinding HeaderStringFormat}" ContentSource="Header" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> </Grid> <ControlTemplate.Triggers> <Trigger Property="IsHighlighted" Value="True"> <Setter Property="Background" TargetName="grid" Value="{DynamicResource Brush_PA_CSW_ListBoxItemDefaultHighlight}"/> </Trigger> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Foreground" Value="#FF9A9A9A"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate>
3. contextMenu使用上述style
<ContextMenu x:Key="DataGridColumnsHeaderContextMenu"
   ItemTemplate="{DynamicResource HeaderConfigItemTemplate}"
   ItemContainerStyle="{DynamicResource MenuItemStyle1}"
       Style="{DynamicResource DataGridColumnsHeaderContextMenuStyle}"
/>
标签:contextmenu,menu
0
投稿

猜你喜欢

  • Java Socket实现多线程通信功能示例

    2022-11-29 03:24:59
  • Java程序顺序结构中逻辑控制语句详解流程

    2023-06-10 17:54:08
  • SpringSecurity添加图形验证码认证实现

    2023-07-08 01:37:52
  • Kotlin入门教程之开发环境搭建

    2022-04-22 20:58:12
  • Java输入输出流的使用详细介绍

    2023-08-01 22:21:22
  • Java ArrayDeque使用方法详解

    2022-02-09 08:00:23
  • 手把手教你如何获取微信用户openid

    2023-11-04 01:01:21
  • 详解Java如何实现小顶堆和大顶堆

    2023-11-10 04:03:05
  • 利用C#实现可以继承的"枚举"

    2021-08-08 20:55:50
  • C#中倒序输出字符串的方法示例

    2023-10-27 21:45:13
  • Java实现分布式系统限流

    2022-05-31 22:38:05
  • Android仿google now效果的呼吸按钮

    2023-06-17 07:58:02
  • java 使用DecimalFormat进行数字的格式化实例详解

    2022-04-28 10:55:25
  • 解决IDEA和CMD中java命令提示错误: 找不到或无法加载主类的问题

    2023-09-19 02:31:16
  • 深入理解ThreadLocal工作原理及使用示例

    2022-02-27 19:24:14
  • Struts2 Result 参数详解

    2022-04-28 07:54:35
  • 详解Java 信号量Semaphore

    2021-12-22 11:10:36
  • 微信第三方登录Android实现代码

    2023-07-27 08:05:49
  • c# 用Base64实现文件上传

    2023-12-20 00:52:11
  • Android 控制wifi 相关操作实例

    2023-09-08 20:35:49
  • asp之家 软件编程 m.aspxhome.com