Xaml 在多个GridView控件之间共享样式

Xaml 在多个GridView控件之间共享样式,xaml,gridview,windows-8,winrt-xaml,Xaml,Gridview,Windows 8,Winrt Xaml,我需要在整个应用程序中使用相同的视觉样式设置几个GridView。此样式包括自定义ItemsPanel属性以及GroupStyle属性 我的问题是GridView的GroupStyle属性不是依赖性属性。所以我想写的代码(见下文)不起作用 您知道在多个GridView之间共享样式(包括GroupStyle)的干净方法吗 我能想到的唯一一件事就是使用GroupStyleSelector,但这有点愚蠢,因为没有选择:总是使用相同的GroupStyle。此外,我怀疑它不会在VS&Blend的设计阶段反

我需要在整个应用程序中使用相同的视觉样式设置几个
GridView
。此样式包括自定义
ItemsPanel
属性以及
GroupStyle
属性

我的问题是
GridView
GroupStyle
属性不是依赖性属性。所以我想写的代码(见下文)不起作用

您知道在多个
GridView
之间共享样式(包括
GroupStyle
)的干净方法吗

我能想到的唯一一件事就是使用
GroupStyleSelector
,但这有点愚蠢,因为没有选择:总是使用相同的
GroupStyle
。此外,我怀疑它不会在VS&Blend的设计阶段反映出来

我想使用的代码是:

<GridView 
     ItemsSource="..."
     ItemTemplate="..."
     Style="{StaticResource MainMenuStyle}"/>

<Style TargetType="GridView" x:Key="MainMenuStyle">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            ...
        </Setter.Value>
    </Setter>
    <Setter Property="GroupStyle">
        <Setter.Value>
            <GroupStyle>
                ...
            </GroupStyle>
        </Setter.Value>
    </Setter>
</Style>

...
...

我有一个解决方案,它肯定会根据您的问题起作用,但您应该决定是否在您的案例中使用它

  • 如果必须在整个项目中创建相同样式的控件,则应在该文件夹中创建一个公用文件夹 创建一个“自定义用户控件”,并应用所有样式和 根据需要定制它

  • 之后,当您需要在同一控件(任何网格控件)上应用相同样式时,只需添加该自定义用户
    控件而不是预定义控件

通过这样做,您还可以实现MVC体系结构和模块化。

我正在用XAML在C#中开发Windows 8 Metro应用程序,在这种情况下,每当我需要这种方法时,我总是使用这种解决方案,它总是有效的

要创建自定义用户控件,您应该使用visual studio&在中,右键单击project->add->new item->user control


(如果您在这里找不到解决方案,很抱歉,但我认为这可能会有所帮助……

我有一个神奇的快乐解决方案

可以创建在样式中设置的自定义附着特性,并在内部设置后在GridView上设置GroupStyle特性

附属财产:

//XAML中缺少泛型的解决方法
公共类GroupStyleCollection:集合
{
}
公共类GroupStyleHelper
{
公共静态ICollection GetGroupStyle(ItemsControl对象)
{
返回(ICollection)对象GetValue(GroupStyleProperty);
}
公共静态void SetGroupStyle(ItemsControl对象,ICollection值)
{
obj.SetValue(GroupStyleProperty,value);
}
公共静态只读DependencyProperty GroupStyleProperty=
DependencyProperty.RegisterAttached(
“群体风格”,
类型(ICollection),
typeof(GroupStyleHelper),
新的PropertyMetadata(null,OnGroupStyleChanged));
私有静态无效OnGroupStyleChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
ItemsControl ItemsControl=d作为ItemsControl;
if(itemsControl==null)
返回;
RefreshGroupStyle(itemsControl,GetGroupStyle(itemsControl));
}
私有静态void RefreshGroupStyle(ItemsControl ItemsControl,IEnumerable groupStyle)
{
itemsControl.GroupStyle.Clear();
if(groupStyle==null)
返回;
foreach(groupStyle中的变量项)
{
itemsControl.GroupStyle.Add(项目);
}
}
}
XAML样式:



免责声明:我正在WPF而不是WinRT中测试此功能,但据我所知,它的工作原理应该是一样的。这也是为什么我使用ItemsControl而不是GridView,但是属性仍然是ItemsControl.GroupStyle。

你能把你的网格布局按照你想要的方式作为一个
用户控件
并公开像“ItemsSource”这样的依赖属性,这样你就可以将它应用到实例中,允许你回收相同的模板,但仍然填充不同的数据吗?是的,看起来是寻找答案的好方法。尚未了解有关
UserControl
,似乎是开始的好时机。谢谢,看起来与另一个答案的线索相同。我会尽快试一试。