首页 > 编程 > C# > 正文

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

2019-10-29 21:39:22
字体:
来源:转载
供稿:网友

ContextMenu 类表示当用户在控件或窗体的特定区域上单击鼠标右键时会显示的快捷菜单,要想实现自定义的Menu和ContextMenu效果,大家可以通过派生ProfessionalColorTable类,下面小编把实现Menu和ContextMenu自定义风格及ContextMenu自定义给大家整理一下

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

 

 
  1. using System.Drawing; 
  2. using System.Windows.Forms; 
  3. public class CustomToolStripColorTable : ProfessionalColorTable 
  4. /// <summary> 
  5. /// 主菜单项被点击后,展开的下拉菜单面板的边框 
  6. /// </summary> 
  7. public override Color MenuBorder 
  8. get 
  9. return Color.FromArgb(37, 37, 37); 
  10. /// <summary> 
  11. /// 鼠标移动到菜单项(主菜单及下拉菜单)时,下拉菜单项的边框 
  12. /// </summary> 
  13. public override Color MenuItemBorder 
  14. get 
  15. return Color.Transparent; 
  16. #region 顶级菜单被选中背景颜色 
  17. public override Color MenuItemSelectedGradientBegin 
  18. get 
  19. return Color.FromArgb(37, 37, 37); 
  20. public override Color MenuItemSelectedGradientEnd 
  21. get 
  22. return Color.FromArgb(37, 37, 37); 
  23. #endregion 
  24. #region 顶级菜单被按下是,菜单项背景色 
  25. public override Color MenuItemPressedGradientBegin 
  26. get 
  27. return Color.Black; 
  28. public override Color MenuItemPressedGradientMiddle 
  29. get 
  30. return Color.FromArgb(37, 37, 37); 
  31. public override Color MenuItemPressedGradientEnd 
  32. get 
  33. return Color.Black; 
  34. #endregion 
  35. /// <summary> 
  36. /// 菜单项被选中时的颜色 
  37. /// </summary> 
  38. public override Color MenuItemSelected 
  39. get 
  40. return Color.FromArgb(37, 37, 37); 
  41. #region 下拉菜单面板背景设置(不包括下拉菜单项) 
  42. //下拉菜单面板背景一共分为2个部分,左边为图像区域,右侧为文本区域,需要分别设置 
  43. //ToolStripDropDownBackground设置文本部分的背景色 
  44. public override Color ToolStripDropDownBackground 
  45. get 
  46. return Color.Black; 
  47. //以ImageMarginGradient开头的3个设置的是图像部分的背景色,begin->end是从左到右的顺序 
  48. public override Color ImageMarginGradientBegin 
  49. get 
  50. return Color.Black; 
  51. public override Color ImageMarginGradientMiddle 
  52. get 
  53. return Color.Black; 
  54. public override Color ImageMarginGradientEnd 
  55. get 
  56. return Color.Black; 
  57. #endregion 

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

 

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

ContextMenu的自定义

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

 

 
  1. <Style x:Key="DataGridColumnsHeaderContextMenuStyle" TargetType="{x:Type ContextMenu}"
  2. <Setter Property="SnapsToDevicePixels" Value="True"/> 
  3. <Setter Property="Grid.IsSharedSizeScope" Value="true"/> 
  4. <Setter Property="HasDropShadow" Value="True"/> 
  5. <Setter Property="Template"
  6. <Setter.Value> 
  7. <ControlTemplate TargetType="{x:Type ContextMenu}"
  8. <Border Uid="Border_93"
  9. <Border.Style> 
  10. <Style TargetType="{x:Type Border}"
  11. <Setter Property="Tag" Value="{DynamicResource {x:Static SystemParameters.DropShadowKey}}"/> 
  12. <Style.Triggers> 
  13. <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True"
  14. <Setter Property="Effect"
  15. <Setter.Value> 
  16. <DropShadowEffect BlurRadius="4" Opacity="0.8" ShadowDepth="1"/> 
  17. </Setter.Value> 
  18. </Setter> 
  19. </DataTrigger> 
  20. </Style.Triggers> 
  21. </Style> 
  22. </Border.Style> 
  23. <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Uid="Border_50"
  24. <ScrollViewer CanContentScroll="True" Uid="ScrollViewer_9" 
  25. Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}}"
  26. <ItemsPresenter KeyboardNavigation.DirectionalNavigation="Cycle" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Uid="ItemsPresenter_5"/> 
  27. </ScrollViewer> 
  28. </Border> 
  29. </Border> 
  30. </ControlTemplate> 
  31. </Setter.Value> 
  32. </Setter> 
  33. </Style> 

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

 

 
  1. <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> 
  2. 3. contextMenu使用上述style 
  3. <ContextMenu x:Key="DataGridColumnsHeaderContextMenu" 
  4. ItemTemplate="{DynamicResource HeaderConfigItemTemplate}" 
  5. ItemContainerStyle="{DynamicResource MenuItemStyle1}" 
  6. Style="{DynamicResource DataGridColumnsHeaderContextMenuStyle}" 
  7. /> 

以上就是本文通过C#实现Menu和ContextMenu自定义风格及contextMenu自定义的全部内容,希望大家喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表