[英]C# WPF MenuItem custom template
在Main.xaml中,我有以下兩個菜單項:
為了編輯第一個項目的某些顏色,我在App.xaml中創建了一個自定義模板:
<!--Template for Menu Items-->
<Style x:Key="MenuItemBaseStyle" TargetType="MenuItem">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" Value="#0a99f3" />
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<Grid Background="{TemplateBinding Background}">
<MenuItem Header="DISCONNECT FROM CURRENT" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在Main.xaml中:
<MenuItem Header="CONNECTION">
<MenuItem Style="{StaticResource MenuItemBaseStyle}" Header="DISCONNECT FROM CURRENT" />
<MenuItem Header="QUIT"/>
</MenuItem>
現在我想對第二個菜單項做同樣的事情。 問題在於不同的標題。 如果我從模板中刪除標題,即使標題文本仍存在於Main.xaml中,它也不會顯示任何標題
如何將此模板用於許多菜單項,其中唯一更改的是標題文本?
您可以在Header屬性上使用TemplateBinding ,就像在Background
屬性上使用它一樣:
<ControlTemplate TargetType="{x:Type MenuItem}">
<Grid Background="{TemplateBinding Background}">
<MenuItem Header="{TemplateBinding Header}" />
</Grid>
</ControlTemplate>
您可以使用StyleSelector為每個MenuItem創建單獨的樣式。
public class MyStyleSelector : StyleSelector
{
public override Style SelectStyle(object item, DependencyObject container)
{
var itemsControl = ItemsControl.ItemsControlFromItemContainer(container);
var index = itemsControl.ItemContainerGenerator.IndexFromContainer(container);
if (index == 0)
return (Style)itemsControl.FindResource("FirstItemStyle");
if (index == 1)
return (Style)itemsControl.FindResource("SecondItemStyle");
return base.SelectStyle(item, container);
}
}
在你的XAML中
<Window x:Class="Menus.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Menus"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:MyStyleSelector x:Key="MyStyleSelector" />
<Style x:Key="FirstItemStyle" TargetType="MenuItem">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" Value="#0a99f3" />
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
<Style x:Key="SecondItemStyle" TargetType="MenuItem">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" Value="Red" />
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<Menu ItemContainerStyleSelector="{StaticResource MyStyleSelector}">
<MenuItem Header="Menu 1" />
<MenuItem Header="Menu 2" />
<MenuItem Header="Menu 3" />
</Menu>
</Grid>
請參見StyleSelector: StyleSelector
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.