Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在xaml上设置GroupStyle内部样式_Wpf_Xaml - Fatal编程技术网

Wpf 在xaml上设置GroupStyle内部样式

Wpf 在xaml上设置GroupStyle内部样式,wpf,xaml,Wpf,Xaml,我正在尝试为ContexMenu设置默认样式,并希望在样式内将默认GroupStyle设置为ContexMenu。大概是这样的: <Setter Property="ItemsControl.GroupStyle"> <Setter.Value> <GroupStyle> <...> </GroupStyle> </Setter.Value> </Set

我正在尝试为ContexMenu设置默认样式,并希望在样式内将默认GroupStyle设置为ContexMenu。大概是这样的:

<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);
}
}
}

对于列表框样式,您可以设置列表框而不是菜单。此解决方案也适用于其他样式