Wpf 在xaml上设置GroupStyle内部样式
我正在尝试为ContexMenu设置默认样式,并希望在样式内将默认GroupStyle设置为ContexMenu。大概是这样的:Wpf 在xaml上设置GroupStyle内部样式,wpf,xaml,Wpf,Xaml,我正在尝试为ContexMenu设置默认样式,并希望在样式内将默认GroupStyle设置为ContexMenu。大概是这样的: <Setter Property="ItemsControl.GroupStyle"> <Setter.Value> <GroupStyle> <...> </GroupStyle> </Setter.Value> </Set
<Setter Property="ItemsControl.GroupStyle">
<Setter.Value>
<GroupStyle>
<...>
</GroupStyle>
</Setter.Value>
</Setter>
<Style TargetType="ContextMenu">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContextMenu">
<Border>
<Menu ItemsSource="{TemplateBinding ItemsSource}">
<Menu.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<Border Background="Black">
<ItemsPresenter/>
</Border>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</Menu.GroupStyle>
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel></StackPanel>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
</Menu>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
如何在xaml中实现这一点
提前谢谢 实际上,只要做一些额外的工作就可以做到:
您不必将
ContexMenu
的模板设置为ItemsPresenter
,而可以将其设置为适合您的数据的控件。在这种情况下,您可以将其设置为菜单
。就这样,
<Setter Property="ItemsControl.GroupStyle">
<Setter.Value>
<GroupStyle>
<...>
</GroupStyle>
</Setter.Value>
</Setter>
<Style TargetType="ContextMenu">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContextMenu">
<Border>
<Menu ItemsSource="{TemplateBinding ItemsSource}">
<Menu.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<StackPanel>
<Border Background="Black">
<ItemsPresenter/>
</Border>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</Menu.GroupStyle>
<Menu.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel></StackPanel>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
</Menu>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
现在,虽然GroupStyle
是只读的,但我们可以通过PropertyElement
:-)进行设置
为了准确感受
ContexMenu
的MenuItem
,您可以调整MenuItem
的样式,我的解决方法是创建一个从列表框控件继承的新控件,该控件添加了可绑定的DefaultGroupStyle:
public class MyListBox : ListBox
{
public GroupStyle DefaultGroupStyle
{
get { return (GroupStyle)GetValue(DefaultGroupStyleProperty); }
set { SetValue(DefaultGroupStyleProperty, value); }
}
// Using a DependencyProperty as the backing store for DefaultGroupStyle. This enables animation, styling, binding, etc...
public static readonly DependencyProperty DefaultGroupStyleProperty =
DependencyProperty.Register("DefaultGroupStyle", typeof(GroupStyle), typeof(MyListBox), new UIPropertyMetadata(null, DefaultGroupStyleChanged));
private static void DefaultGroupStyleChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
((MyListBox)o).SetDefaultGroupStyle(e.NewValue as GroupStyle);
}
private void SetDefaultGroupStyle(GroupStyle defaultStyle)
{
if (defaultStyle == null)
{
return;
}
if (this.GroupStyle.Count == 0)
{
this.GroupStyle.Add(defaultStyle);
}
}
}
可以使用附着的特性简化添加组样式:
以下是附加属性的代码:
使用系统;
使用System.Windows;
使用System.Windows.Controls;
命名空间Util
{
公共静态类groupstylex
{
公共静态只读DependencyProperty AppendProperty
=DependencyProperty.RegisterAttached(“附加”)、typeof(GroupStyle)、typeof(GroupStyleEx),
新属性元数据(附录已更改);
公共静态GroupStyle GetAppend(DependencyObject obj)
{
返回(GroupStyle)对象获取值(AppendProperty);
}
公共静态void SetAppend(DependencyObject对象,GroupStyle样式)
{
obj.SetValue(AppendProperty,style);
}
私有静态无效附件已更改(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
var itemsControl=d作为itemsControl;
if(itemsControl==null)
抛出新的InvalidOperationException(“只能将GroupStyle添加到ItemsControl”);
var@new=e.NewValue作为GroupStyle;
如果(@new!=null)
itemsControl.GroupStyle.Add(@new);
}
}
}
对于列表框样式,您可以设置列表框而不是菜单。此解决方案也适用于其他样式