1 <SolidColorBrush 2 x:Key="Menu.Static.Background" 3 Color="#FFF0F0F0" /> 4 <SolidColorBrush 5 x:Key="Menu.Static.Border" 6 Color="#FF999999" /> 7 <SolidColorBrush 8 x:Key="Menu.Static.Foreground" 9 Color="#FF212121" /> 10 <SolidColorBrush 11 x:Key="Menu.Static.Separator" 12 Color="#FFD7D7D7" /> 13 <SolidColorBrush 14 x:Key="Menu.Disabled.Foreground" 15 Color="#FF707070" /> 16 <SolidColorBrush 17 x:Key="MenuItem.Selected.Background" 18 Color="#3D26A0DA" /> 19 <SolidColorBrush 20 x:Key="MenuItem.Selected.Border" 21 Color="#FF26A0DA" /> 22 <SolidColorBrush 23 x:Key="MenuItem.Highlight.Background" 24 Color="#3D26A0DA" /> 25 <SolidColorBrush 26 x:Key="MenuItem.Highlight.Border" 27 Color="#FF26A0DA" /> 28 <SolidColorBrush 29 x:Key="MenuItem.Highlight.Disabled.Background" 30 Color="#0A000000" /> 31 <SolidColorBrush 32 x:Key="MenuItem.Highlight.Disabled.Border" 33 Color="#21000000" /> 34 <MenuScrollingVisibilityConverter x:Key="MenuScrollingVisibilityConverter" /> 35 <Geometry x:Key="DownArrow">M 0,0 L 3.5,4 L 7,0 Z</Geometry> 36 <Geometry x:Key="UpArrow">M 0,4 L 3.5,0 L 7,4 Z</Geometry> 37 <Geometry x:Key="RightArrow">M 0,0 L 4,3.5 L 0,7 Z</Geometry> 38 <Geometry x:Key="Checkmark">F1 M 10.0,1.2 L 4.7,9.1 L 4.5,9.1 L 0,5.2 L 1.3,3.5 L 4.3,6.1L 8.3,0 L 10.0,1.2 Z</Geometry> 39 40 <Style 41 x:Key="MenuScrollButton" 42 BasedOn="{x:Null}" 43 TargetType="{x:Type RepeatButton}"> 44 <Setter Property="ClickMode" Value="Hover" /> 45 <Setter Property="Template"> 46 <Setter.Value> 47 <ControlTemplate TargetType="{x:Type RepeatButton}"> 48 <Border 49 x:Name="templateRoot" 50 Background="Transparent" 51 BorderBrush="Transparent" 52 BorderThickness="1" 53 SnapsToDevicePixels="true"> 54 <ContentPresenter 55 Margin="6" 56 HorizontalAlignment="Center" 57 VerticalAlignment="Center" /> 58 </Border> 59 </ControlTemplate> 60 </Setter.Value> 61 </Setter> 62 </Style> 63 64 65 <!-- 弹出的子菜单中 ScrollViewer 的样式,用于在菜单项较多时,上下滚动显示所有的菜单项 --> 66 <Style 67 x:Key="{ComponentResourceKey ResourceId=MenuScrollViewer, 68 TypeInTargetAssembly={x:Type FrameworkElement}}" 69 BasedOn="{x:Null}" 70 TargetType="{x:Type ScrollViewer}"> 71 <Setter Property="HorizontalScrollBarVisibility" Value="Hidden" /> 72 <Setter Property="VerticalScrollBarVisibility" Value="Auto" /> 73 <Setter Property="Template"> 74 <Setter.Value> 75 <ControlTemplate TargetType="{x:Type ScrollViewer}"> 76 <Grid SnapsToDevicePixels="true"> 77 <Grid.ColumnDefinitions> 78 <ColumnDefinition Width="*" /> 79 </Grid.ColumnDefinitions> 80 81 <Grid.RowDefinitions> 82 <RowDefinition Height="Auto" /> 83 <RowDefinition Height="*" /> 84 <RowDefinition Height="Auto" /> 85 </Grid.RowDefinitions> 86 87 <!-- 所有的菜单内容 --> 88 <Border 89 Grid.Row="1" 90 Grid.Column="0"> 91 <ScrollContentPresenter 92 Margin="{TemplateBinding Padding}" 93 CanContentScroll="{TemplateBinding CanContentScroll}" /> 94 </Border> 95 96 <!-- 向上滚动按钮 --> 97 <RepeatButton 98 Grid.Row="0" 99 Grid.Column="0" 100 Command="{x:Static ScrollBar.LineUpCommand}" 101 CommandTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" 102 Focusable="false" 103 Style="{StaticResource MenuScrollButton}"> 104 <RepeatButton.Visibility> 105 <MultiBinding 106 Converter="{StaticResource MenuScrollingVisibilityConverter}" 107 ConverterParameter="0" 108 FallbackValue="Visibility.Collapsed"> 109 <Binding 110 Path="ComputedVerticalScrollBarVisibility" 111 RelativeSource="{RelativeSource TemplatedParent}" /> 112 <Binding 113 Path="VerticalOffset" 114 RelativeSource="{RelativeSource TemplatedParent}" /> 115 <Binding 116 Path="ExtentHeight" 117 RelativeSource="{RelativeSource TemplatedParent}" /> 118 <Binding 119 Path="ViewportHeight" 120 RelativeSource="{RelativeSource TemplatedParent}" /> 121 </MultiBinding> 122 </RepeatButton.Visibility> 123 <Path 124 Data="{StaticResource UpArrow}" 125 Fill="{StaticResource Menu.Static.Foreground}" /> 126 </RepeatButton> 127 128 <!-- 向下滚动按钮 --> 129 <RepeatButton 130 Grid.Row="2" 131 Grid.Column="0" 132 Command="{x:Static ScrollBar.LineDownCommand}" 133 CommandTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" 134 Focusable="false" 135 Style="{StaticResource MenuScrollButton}"> 136 <RepeatButton.Visibility> 137 <MultiBinding 138 Converter="{StaticResource MenuScrollingVisibilityConverter}" 139 ConverterParameter="100" 140 FallbackValue="Visibility.Collapsed"> 141 <Binding 142 Path="ComputedVerticalScrollBarVisibility" 143 RelativeSource="{RelativeSource TemplatedParent}" /> 144 <Binding 145 Path="VerticalOffset" 146 RelativeSource="{RelativeSource TemplatedParent}" /> 147 <Binding 148 Path="ExtentHeight" 149 RelativeSource="{RelativeSource TemplatedParent}" /> 150 <Binding 151 Path="ViewportHeight" 152 RelativeSource="{RelativeSource TemplatedParent}" /> 153 </MultiBinding> 154 </RepeatButton.Visibility> 155 <Path 156 Data="{StaticResource DownArrow}" 157 Fill="{StaticResource Menu.Static.Foreground}" /> 158 </RepeatButton> 159 </Grid> 160 </ControlTemplate> 161 </Setter.Value> 162 </Setter> 163 </Style> 164 165 <!-- Role 的文档详见 https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.menuitemrole?view=windowsdesktop-6.0 --> 166 167 <!-- 当 Role= TopLevelItem 时的模版 --> 168 <ControlTemplate 169 x:Key="{ComponentResourceKey ResourceId=TopLevelItemTemplateKey, 170 TypeInTargetAssembly={x:Type MenuItem}}" 171 TargetType="{x:Type MenuItem}"> 172 <Border 173 x:Name="templateRoot" 174 Background="{TemplateBinding Background}" 175 BorderBrush="{TemplateBinding BorderBrush}" 176 BorderThickness="{TemplateBinding BorderThickness}" 177 SnapsToDevicePixels="true"> 178 <Grid VerticalAlignment="Center"> 179 <Grid.ColumnDefinitions> 180 <ColumnDefinition Width="Auto" /> 181 <ColumnDefinition Width="Auto" /> 182 </Grid.ColumnDefinitions> 183 <ContentPresenter 184 x:Name="Icon" 185 Width="16" 186 Height="16" 187 Margin="3" 188 HorizontalAlignment="Center" 189 VerticalAlignment="Center" 190 ContentSource="Icon" 191 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 192 <Path 193 x:Name="GlyphPanel" 194 Margin="3" 195 VerticalAlignment="Center" 196 Data="{StaticResource Checkmark}" 197 Fill="{StaticResource Menu.Static.Foreground}" 198 FlowDirection="LeftToRight" 199 Visibility="Collapsed" /> 200 <ContentPresenter 201 Grid.Column="1" 202 Margin="{TemplateBinding Padding}" 203 ContentSource="Header" 204 RecognizesAccessKey="True" 205 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 206 </Grid> 207 </Border> 208 <ControlTemplate.Triggers> 209 <Trigger Property="Icon" Value="{x:Null}"> 210 <Setter TargetName="Icon" Property="Visibility" Value="Collapsed" /> 211 </Trigger> 212 <Trigger Property="IsChecked" Value="true"> 213 <Setter TargetName="GlyphPanel" Property="Visibility" Value="Visible" /> 214 <Setter TargetName="Icon" Property="Visibility" Value="Collapsed" /> 215 </Trigger> 216 <Trigger Property="IsHighlighted" Value="True"> 217 <Setter TargetName="templateRoot" Property="Background" Value="{StaticResource MenuItem.Highlight.Background}" /> 218 <Setter TargetName="templateRoot" Property="BorderBrush" Value="{StaticResource MenuItem.Highlight.Border}" /> 219 </Trigger> 220 <Trigger Property="IsEnabled" Value="False"> 221 <Setter TargetName="templateRoot" Property="TextElement.Foreground" Value="{StaticResource Menu.Disabled.Foreground}" /> 222 <Setter TargetName="GlyphPanel" Property="Fill" Value="{StaticResource Menu.Disabled.Foreground}" /> 223 </Trigger> 224 <MultiTrigger> 225 <MultiTrigger.Conditions> 226 <Condition Property="IsHighlighted" Value="True" /> 227 <Condition Property="IsEnabled" Value="False" /> 228 </MultiTrigger.Conditions> 229 <Setter TargetName="templateRoot" Property="Background" Value="{StaticResource MenuItem.Highlight.Disabled.Background}" /> 230 <Setter TargetName="templateRoot" Property="BorderBrush" Value="{StaticResource MenuItem.Highlight.Disabled.Border}" /> 231 </MultiTrigger> 232 </ControlTemplate.Triggers> 233 </ControlTemplate> 234 235 <!-- 当 Role= TopLevelHeader 时的模版 --> 236 <ControlTemplate 237 x:Key="{ComponentResourceKey ResourceId=TopLevelHeaderTemplateKey, 238 TypeInTargetAssembly={x:Type MenuItem}}" 239 TargetType="{x:Type MenuItem}"> 240 <Border 241 x:Name="templateRoot" 242 Background="{TemplateBinding Background}" 243 BorderBrush="{TemplateBinding BorderBrush}" 244 BorderThickness="{TemplateBinding BorderThickness}" 245 SnapsToDevicePixels="true"> 246 <Grid VerticalAlignment="Center"> 247 <Grid.ColumnDefinitions> 248 <ColumnDefinition Width="Auto" /> 249 <ColumnDefinition Width="Auto" /> 250 </Grid.ColumnDefinitions> 251 <ContentPresenter 252 x:Name="Icon" 253 Width="16" 254 Height="16" 255 Margin="3" 256 HorizontalAlignment="Center" 257 VerticalAlignment="Center" 258 ContentSource="Icon" 259 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 260 <Path 261 x:Name="GlyphPanel" 262 Margin="3" 263 VerticalAlignment="Center" 264 Data="{StaticResource Checkmark}" 265 Fill="{TemplateBinding Foreground}" 266 FlowDirection="LeftToRight" 267 Visibility="Collapsed" /> 268 <ContentPresenter 269 Grid.Column="1" 270 Margin="{TemplateBinding Padding}" 271 ContentSource="Header" 272 RecognizesAccessKey="True" 273 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 274 <Popup 275 x:Name="PART_Popup" 276 AllowsTransparency="true" 277 Focusable="false" 278 IsOpen="{Binding IsSubmenuOpen, 279 RelativeSource={RelativeSource TemplatedParent}}" 280 Placement="Bottom" 281 PlacementTarget="{Binding ElementName=templateRoot}" 282 PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}"> 283 284 <!-- 弹出的子菜单 --> 285 <Border 286 x:Name="SubMenuBorder" 287 Padding="2" 288 Background="{StaticResource Menu.Static.Background}" 289 BorderBrush="{StaticResource Menu.Static.Border}" 290 BorderThickness="1"> 291 <ScrollViewer 292 x:Name="SubMenuScrollViewer" 293 Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, 294 TypeInTargetAssembly={x:Type FrameworkElement}}}"> 295 <Grid RenderOptions.ClearTypeHint="Enabled"> 296 <Canvas 297 Width="0" 298 Height="0" 299 HorizontalAlignment="Left" 300 VerticalAlignment="Top"> 301 <Rectangle 302 x:Name="OpaqueRect" 303 Width="{Binding ActualWidth, 304 ElementName=SubMenuBorder}" 305 Height="{Binding ActualHeight, 306 ElementName=SubMenuBorder}" 307 Fill="{Binding Background, 308 ElementName=SubMenuBorder}" /> 309 </Canvas> 310 <Rectangle 311 Width="1" 312 Margin="29,2,0,2" 313 HorizontalAlignment="Left" 314 Fill="{StaticResource Menu.Static.Separator}" /> 315 <ItemsPresenter 316 x:Name="ItemsPresenter" 317 Grid.IsSharedSizeScope="true" 318 KeyboardNavigation.DirectionalNavigation="Cycle" 319 KeyboardNavigation.TabNavigation="Cycle" 320 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 321 </Grid> 322 </ScrollViewer> 323 </Border> 324 </Popup> 325 </Grid> 326 </Border> 327 <ControlTemplate.Triggers> 328 <Trigger Property="IsSuspendingPopupAnimation" Value="true"> 329 <Setter TargetName="PART_Popup" Property="PopupAnimation" Value="None" /> 330 </Trigger> 331 <Trigger Property="Icon" Value="{x:Null}"> 332 <Setter TargetName="Icon" Property="Visibility" Value="Collapsed" /> 333 </Trigger> 334 <Trigger Property="IsChecked" Value="true"> 335 <Setter TargetName="GlyphPanel" Property="Visibility" Value="Visible" /> 336 <Setter TargetName="Icon" Property="Visibility" Value="Collapsed" /> 337 </Trigger> 338 <Trigger Property="IsHighlighted" Value="True"> 339 <Setter TargetName="templateRoot" Property="Background" Value="{StaticResource MenuItem.Highlight.Background}" /> 340 <Setter TargetName="templateRoot" Property="BorderBrush" Value="{StaticResource MenuItem.Highlight.Border}" /> 341 </Trigger> 342 <Trigger Property="IsEnabled" Value="False"> 343 <Setter TargetName="templateRoot" Property="TextElement.Foreground" Value="{StaticResource Menu.Disabled.Foreground}" /> 344 <Setter TargetName="GlyphPanel" Property="Fill" Value="{StaticResource Menu.Disabled.Foreground}" /> 345 </Trigger> 346 <Trigger SourceName="SubMenuScrollViewer" Property="ScrollViewer.CanContentScroll" Value="false"> 347 <Setter TargetName="OpaqueRect" Property="Canvas.Top" Value="{Binding VerticalOffset, ElementName=SubMenuScrollViewer}" /> 348 <Setter TargetName="OpaqueRect" Property="Canvas.Left" Value="{Binding HorizontalOffset, ElementName=SubMenuScrollViewer}" /> 349 </Trigger> 350 </ControlTemplate.Triggers> 351 </ControlTemplate> 352 353 <!-- MenuItem 常规的模版 --> 354 <ControlTemplate 355 x:Key="{ComponentResourceKey ResourceId=SubmenuItemTemplateKey, 356 TypeInTargetAssembly={x:Type MenuItem}}" 357 TargetType="{x:Type MenuItem}"> 358 <Border 359 x:Name="templateRoot" 360 Height="22" 361 Background="{TemplateBinding Background}" 362 BorderBrush="{TemplateBinding BorderBrush}" 363 BorderThickness="{TemplateBinding BorderThickness}" 364 SnapsToDevicePixels="true"> 365 <Grid Margin="-1"> 366 <!-- 布局 0~5 共 6 列, 其中 1,3,5 用作留空 --> 367 <Grid.ColumnDefinitions> 368 <ColumnDefinition 369 Width="Auto" 370 MinWidth="22" 371 SharedSizeGroup="MenuItemIconColumnGroup" /> 372 <ColumnDefinition Width="13" /> 373 <ColumnDefinition Width="*" /> 374 <ColumnDefinition Width="30" /> 375 <ColumnDefinition 376 Width="Auto" 377 SharedSizeGroup="MenuItemIGTColumnGroup" /> 378 <ColumnDefinition Width="20" /> 379 </Grid.ColumnDefinitions> 380 381 <!-- 第 0 列 图标 --> 382 <ContentPresenter 383 x:Name="Icon" 384 Width="16" 385 Height="16" 386 Margin="3" 387 HorizontalAlignment="Center" 388 VerticalAlignment="Center" 389 ContentSource="Icon" 390 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 391 392 <!-- 第 0 列,勾(用于标识是否勾选) --> 393 <Border 394 x:Name="GlyphPanel" 395 Width="22" 396 Height="22" 397 Margin="-1,0,0,0" 398 HorizontalAlignment="Center" 399 VerticalAlignment="Center" 400 Background="{StaticResource MenuItem.Selected.Background}" 401 BorderBrush="{StaticResource MenuItem.Selected.Border}" 402 BorderThickness="1" 403 ClipToBounds="False" 404 Visibility="Hidden"> 405 <Path 406 x:Name="Glyph" 407 Width="10" 408 Height="11" 409 Data="{StaticResource Checkmark}" 410 Fill="{StaticResource Menu.Static.Foreground}" 411 FlowDirection="LeftToRight" /> 412 </Border> 413 414 <!-- 第 2 列 MenuItem.Header 的内容 --> 415 <ContentPresenter 416 x:Name="menuHeaderContainer" 417 Grid.Column="2" 418 Margin="{TemplateBinding Padding}" 419 HorizontalAlignment="Left" 420 VerticalAlignment="Center" 421 ContentSource="Header" 422 RecognizesAccessKey="True" 423 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 424 425 <!-- 第 4 列 MenuItem.menuGestureText 的内容 --> 426 <TextBlock 427 x:Name="menuGestureText" 428 Grid.Column="4" 429 Margin="{TemplateBinding Padding}" 430 VerticalAlignment="Center" 431 Opacity="0.7" 432 Text="{TemplateBinding InputGestureText}" /> 433 </Grid> 434 </Border> 435 <ControlTemplate.Triggers> 436 <!-- 有图标的时候显示图标,没图标则隐藏 --> 437 <Trigger Property="Icon" Value="{x:Null}"> 438 <Setter TargetName="Icon" Property="Visibility" Value="Collapsed" /> 439 </Trigger> 440 441 <!-- 被勾选时显示勾选,并且隐藏图标 --> 442 <Trigger Property="IsChecked" Value="True"> 443 <Setter TargetName="GlyphPanel" Property="Visibility" Value="Visible" /> 444 <Setter TargetName="Icon" Property="Visibility" Value="Collapsed" /> 445 </Trigger> 446 447 <!-- 高亮时 改变背景色和边框色 --> 448 <Trigger Property="IsHighlighted" Value="True"> 449 <Setter TargetName="templateRoot" Property="Background" Value="{StaticResource MenuItem.Highlight.Background}" /> 450 <Setter TargetName="templateRoot" Property="BorderBrush" Value="{StaticResource MenuItem.Highlight.Border}" /> 451 </Trigger> 452 453 <!-- 不可用时 将文字内容和勾设为禁用色 --> 454 <Trigger Property="IsEnabled" Value="False"> 455 <Setter TargetName="templateRoot" Property="TextElement.Foreground" Value="{StaticResource Menu.Disabled.Foreground}" /> 456 <Setter TargetName="Glyph" Property="Fill" Value="{StaticResource Menu.Disabled.Foreground}" /> 457 </Trigger> 458 459 <!-- 高亮且禁用时 改变背景色和边框色 --> 460 <MultiTrigger> 461 <MultiTrigger.Conditions> 462 <Condition Property="IsHighlighted" Value="True" /> 463 <Condition Property="IsEnabled" Value="False" /> 464 </MultiTrigger.Conditions> 465 <Setter TargetName="templateRoot" Property="Background" Value="{StaticResource MenuItem.Highlight.Disabled.Background}" /> 466 <Setter TargetName="templateRoot" Property="BorderBrush" Value="{StaticResource MenuItem.Highlight.Disabled.Border}" /> 467 </MultiTrigger> 468 </ControlTemplate.Triggers> 469 </ControlTemplate> 470 471 <!-- 当 Role= SubmenuHeader 即有子菜单时的模版 --> 472 <!-- 与常规模版的主要区别是增加了子菜单的 popup 和弹出动画等 --> 473 <ControlTemplate 474 x:Key="{ComponentResourceKey ResourceId=SubmenuHeaderTemplateKey, 475 TypeInTargetAssembly={x:Type MenuItem}}" 476 TargetType="{x:Type MenuItem}"> 477 <Border 478 x:Name="templateRoot" 479 Height="22" 480 Background="{TemplateBinding Background}" 481 BorderBrush="{TemplateBinding BorderBrush}" 482 BorderThickness="{TemplateBinding BorderThickness}" 483 SnapsToDevicePixels="true"> 484 <Grid Margin="-1"> 485 <Grid.ColumnDefinitions> 486 <ColumnDefinition 487 Width="Auto" 488 MinWidth="22" 489 SharedSizeGroup="MenuItemIconColumnGroup" /> 490 <ColumnDefinition Width="13" /> 491 <ColumnDefinition Width="*" /> 492 <ColumnDefinition Width="30" /> 493 <ColumnDefinition 494 Width="Auto" 495 SharedSizeGroup="MenuItemIGTColumnGroup" /> 496 <ColumnDefinition Width="20" /> 497 </Grid.ColumnDefinitions> 498 <ContentPresenter 499 x:Name="Icon" 500 Width="16" 501 Height="16" 502 Margin="3" 503 HorizontalAlignment="Center" 504 VerticalAlignment="Center" 505 ContentSource="Icon" 506 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 507 <Border 508 x:Name="GlyphPanel" 509 Width="22" 510 Height="22" 511 Margin="-1,0,0,0" 512 VerticalAlignment="Center" 513 Background="{StaticResource MenuItem.Highlight.Background}" 514 BorderBrush="{StaticResource MenuItem.Highlight.Border}" 515 BorderThickness="1" 516 Visibility="Hidden"> 517 <Path 518 x:Name="Glyph" 519 Width="9" 520 Height="11" 521 Data="{DynamicResource Checkmark}" 522 Fill="{StaticResource Menu.Static.Foreground}" 523 FlowDirection="LeftToRight" /> 524 </Border> 525 <ContentPresenter 526 Grid.Column="2" 527 Margin="{TemplateBinding Padding}" 528 HorizontalAlignment="Left" 529 VerticalAlignment="Center" 530 ContentSource="Header" 531 RecognizesAccessKey="True" 532 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 533 <TextBlock 534 Grid.Column="4" 535 Margin="{TemplateBinding Padding}" 536 VerticalAlignment="Center" 537 Opacity="0.7" 538 Text="{TemplateBinding InputGestureText}" /> 539 <Path 540 x:Name="RightArrow" 541 Grid.Column="5" 542 Margin="10,0,0,0" 543 HorizontalAlignment="Left" 544 VerticalAlignment="Center" 545 Data="{StaticResource RightArrow}" 546 Fill="{StaticResource Menu.Static.Foreground}" /> 547 <Popup 548 x:Name="PART_Popup" 549 AllowsTransparency="true" 550 Focusable="false" 551 HorizontalOffset="-2" 552 IsOpen="{Binding IsSubmenuOpen, 553 RelativeSource={RelativeSource TemplatedParent}}" 554 Placement="Right" 555 PopupAnimation="{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}" 556 VerticalOffset="-3"> 557 558 <Border 559 x:Name="SubMenuBorder" 560 Padding="2" 561 Background="{StaticResource Menu.Static.Background}" 562 BorderBrush="{StaticResource Menu.Static.Border}" 563 BorderThickness="1"> 564 <ScrollViewer 565 x:Name="SubMenuScrollViewer" 566 Style="{DynamicResource {ComponentResourceKey ResourceId=MenuScrollViewer, 567 TypeInTargetAssembly={x:Type FrameworkElement}}}"> 568 <Grid RenderOptions.ClearTypeHint="Enabled"> 569 <Canvas 570 Width="0" 571 Height="0" 572 HorizontalAlignment="Left" 573 VerticalAlignment="Top"> 574 <Rectangle 575 x:Name="OpaqueRect" 576 Width="{Binding ActualWidth, 577 ElementName=SubMenuBorder}" 578 Height="{Binding ActualHeight, 579 ElementName=SubMenuBorder}" 580 Fill="{Binding Background, 581 ElementName=SubMenuBorder}" /> 582 </Canvas> 583 <Rectangle 584 Width="1" 585 Margin="29,2,0,2" 586 HorizontalAlignment="Left" 587 Fill="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" /> 588 <ItemsPresenter 589 x:Name="ItemsPresenter" 590 Grid.IsSharedSizeScope="true" 591 KeyboardNavigation.DirectionalNavigation="Cycle" 592 KeyboardNavigation.TabNavigation="Cycle" 593 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 594 </Grid> 595 </ScrollViewer> 596 </Border> 597 </Popup> 598 </Grid> 599 </Border> 600 <ControlTemplate.Triggers> 601 <Trigger Property="IsSuspendingPopupAnimation" Value="true"> 602 <Setter TargetName="PART_Popup" Property="PopupAnimation" Value="None" /> 603 </Trigger> 604 <Trigger Property="Icon" Value="{x:Null}"> 605 <Setter TargetName="Icon" Property="Visibility" Value="Collapsed" /> 606 </Trigger> 607 <Trigger Property="IsChecked" Value="True"> 608 <Setter TargetName="GlyphPanel" Property="Visibility" Value="Visible" /> 609 <Setter TargetName="Icon" Property="Visibility" Value="Collapsed" /> 610 </Trigger> 611 <Trigger Property="IsHighlighted" Value="True"> 612 <Setter TargetName="templateRoot" Property="Background" Value="Transparent" /> 613 <Setter TargetName="templateRoot" Property="BorderBrush" Value="{StaticResource MenuItem.Highlight.Border}" /> 614 </Trigger> 615 <Trigger Property="IsEnabled" Value="False"> 616 <Setter TargetName="templateRoot" Property="TextElement.Foreground" Value="{StaticResource Menu.Disabled.Foreground}" /> 617 <Setter TargetName="Glyph" Property="Fill" Value="{StaticResource Menu.Disabled.Foreground}" /> 618 <Setter TargetName="RightArrow" Property="Fill" Value="{StaticResource Menu.Disabled.Foreground}" /> 619 </Trigger> 620 <Trigger SourceName="SubMenuScrollViewer" Property="ScrollViewer.CanContentScroll" Value="false"> 621 <Setter TargetName="OpaqueRect" Property="Canvas.Top" Value="{Binding VerticalOffset, ElementName=SubMenuScrollViewer}" /> 622 <Setter TargetName="OpaqueRect" Property="Canvas.Left" Value="{Binding HorizontalOffset, ElementName=SubMenuScrollViewer}" /> 623 </Trigger> 624 </ControlTemplate.Triggers> 625 </ControlTemplate> 626 627 <Style 628 x:Key="MenuItemStyle1" 629 TargetType="{x:Type MenuItem}"> 630 <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" /> 631 <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" /> 632 <Setter Property="Background" Value="Transparent" /> 633 <Setter Property="BorderBrush" Value="Transparent" /> 634 <Setter Property="BorderThickness" Value="1" /> 635 <Setter Property="ScrollViewer.PanningMode" Value="Both" /> 636 <Setter Property="Stylus.IsFlicksEnabled" Value="False" /> 637 <!-- MenuItem 的常规版 --> 638 <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=SubmenuItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}" /> 639 640 <Style.Triggers> 641 <Trigger Property="Role" Value="TopLevelHeader"> 642 <Setter Property="Background" Value="Transparent" /> 643 <Setter Property="BorderBrush" Value="Transparent" /> 644 <Setter Property="Foreground" Value="{StaticResource Menu.Static.Foreground}" /> 645 <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=TopLevelHeaderTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}" /> 646 <Setter Property="Padding" Value="6,0" /> 647 </Trigger> 648 <Trigger Property="Role" Value="TopLevelItem"> 649 <Setter Property="Background" Value="{StaticResource Menu.Static.Background}" /> 650 <Setter Property="BorderBrush" Value="{StaticResource Menu.Static.Border}" /> 651 <Setter Property="Foreground" Value="{StaticResource Menu.Static.Foreground}" /> 652 <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=TopLevelItemTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}" /> 653 <Setter Property="Padding" Value="6,0" /> 654 </Trigger> 655 656 <!-- 当 Role= SubmenuHeader 时 改变模版为 SubmenuHeaderTemplateKey --> 657 <Trigger Property="Role" Value="SubmenuHeader"> 658 <Setter Property="Template" Value="{DynamicResource {ComponentResourceKey ResourceId=SubmenuHeaderTemplateKey, TypeInTargetAssembly={x:Type MenuItem}}}" /> 659 </Trigger> 660 </Style.Triggers> 661 </Style>