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
投稿
猜你喜欢
详解JavaWeb中的 Listener
2023-09-04 08:09:24
Android仿微信长按录制视频并播放功能
2023-02-16 23:26:33
spring cloud Ribbon用法及原理解析
2021-11-28 15:27:21
springMVC实现图形验证码(kaptcha)代码实例
2022-02-14 22:02:14
spring profile 多环境配置管理详解
2023-01-23 17:53:58
使用SpringBoot-JPA进行自定义保存及批量保存功能
2022-05-26 22:42:43
C#实现简易计算器
2021-12-10 03:33:26
Java Jedis NOAUTH Authentication required问题解决方法
2023-08-19 14:09:47
浅谈Hibernate对象状态之间的神奇转换
2021-12-18 02:13:18
SpringBoot自定义Starter实现流程详解
2022-05-19 07:03:25
Android开发使用RecyclerView添加点击事件实例详解
2022-04-30 14:11:55
永久解决idea git log乱码的问题
2022-01-10 06:13:13
深入了解java NIO之Selector(选择器)
2022-02-01 16:39:17
Android IPC机制绑定Service实现本地通信
2023-10-08 15:25:40
C#实现将聊天数据发送加密
2022-09-10 05:56:35
Spring Boot 2.0.0 终于正式发布-重大修订版本
2021-08-12 08:25:51
Java高并发之CyclicBarrier的用法详解
2023-11-17 16:27:57
解决IDEA springboot"spring-boot-maven-plugin"报红问题
2023-08-15 21:29:19
基于Mock测试Spring MVC接口过程解析
2023-11-27 12:04:30
使用idea和gradle编译spring5源码的方法步骤
2022-04-02 12:21:53