在 Generic.xaml 的模板化控件中应用默认样式

Posted

技术标签:

【中文标题】在 Generic.xaml 的模板化控件中应用默认样式【英文标题】:Applying default style in templated control from Generic.xaml 【发布时间】:2016-10-16 23:16:31 【问题描述】:

我在 WinRT/UWP 中创建了一个模板化控件,其中包含一个 GridView。我创建了一个 ItemTemplate 依赖属性,它将容纳网格视图项目的DataTemplate,这样当控件在其他页面上重新使用时,我可以灵活地更改项目模板在每个实现中。

但是,使用我拥有的当前代码,它可以正确加载控件但未实现样式。

这是我的 Generic.xaml 代码:

<Style TargetType="ctrl:CustomGridView">
    <Setter Property="ItemTemplate">
        <Setter.Value>
            <DataTemplate>
                <Grid>
                    <Grid Background="Red">
                            <TextBlock Text="Binding Name, Mode=OneWay" Foreground="White" TextAlignment="Center"/>
                    </Grid>
                </Grid>
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ctrl:CustomGridView">
                <Grid>
                    <ContentPresenter x:Name="templateProxy" Width="TemplateBinding ItemWidth" Height="TemplateBinding ItemHeight"  ContentTemplate="TemplateBinding ItemTemplate" Visibility="Collapsed" />
                    <GridView x:Name="gridView" ItemsSource="TemplateBinding ItemsSource"
                              SelectionMode="None" IsItemClickEnabled="True" IsSwipeEnabled="False" IsTabStop="False">
                        <GridView.ItemTemplate>
                            <DataTemplate>
                                <ContentPresenter Width="Binding Width, ElementName=templateProxy" Height="Binding Height, ElementName=templateProxy" ContentTemplate="TemplateBinding ItemTemplate" />
                            </DataTemplate>
                        </GridView.ItemTemplate>
                    </GridView>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

目标是使 Generic.xaml 中的ItemTemplate 设置为默认设置,并允许在控件的不同实现上更改它。

下面是 ItemTemplate 属性在 CustomGridView.cs 文件中的定义方式:

    public static readonly DependencyProperty ItemTemplateProperty =
       DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(PatientGridView), new PropertyMetadata(null));

    public DataTemplate ItemTemplate
    
        get  return (DataTemplate)GetValue(ItemTemplateProperty); 
        set  SetValue(ItemTemplateProperty, value); 
    

我应该在 CustomGridView.cs 中做些什么来加载默认的 ItemTemplate?我错过了什么吗?

如有必要,我会提供额外的代码。

非常感谢!

【问题讨论】:

【参考方案1】:

您必须包含此代码:

[assembly: ThemeInfo(ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)]

到您的 AssemblyInfo.cs 文件

【讨论】:

ThemeInfo 未显示在 IntelliSense 中。请注意,这是一个 UWP (Windows 10) 应用程序。

以上是关于在 Generic.xaml 的模板化控件中应用默认样式的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 XAML 中的控件模板属性

是否可以在ControlTemplate中包含Xaml资源?

WPF中的Generic.xaml, theme以及custom control

WPF -- Generic.xaml文件报错

WPF -- Generic.xaml文件报错

UWP中实现大爆炸效果