WPF中ListViewItem如何引用默认样式ControlTemplate?
How to reference the default style ControlTemplate for ListViewItem in WPF?
在 WPF 中,如果我将 GridView
应用于 ListView
,那么它会自动将 ListViewItem
的 Template
属性 更改为ControlTemplate
使用 GridViewRowPresenter
而不是 ContentPresenter
。这通常是您想要的。
不过,碰巧的是,我想保留原始的 ContentPresenter
,这样它将呈现 ListView
的 ItemTemplate
。
(出于好奇:我正在做一个父子关系,其中列实际上用于子元素,所以虽然我仍然有一个 GridViewRowPresenter
,但它位于 ItemTemplate
的 ListView
.)
我 可以 通过在 ListView
上设置 ItemContainerStyle
并在其中设置 Template
属性 来做到这一点自定义 ControlTemplate
,因为这将覆盖 GridView
应用的样式 setter。
然而,这变得非常冗长(尤其是要保留选择颜色)并且它破坏了自然主题支持,除非我为每个主题复制模板,这绝对是愚蠢的。
我真正想做的是这样写:
<Setter Property="Template"
Value="{StaticResource {FindDefaultControlTemplate ListViewItem}}" />
其中后者绕过GridView
设置的ControlTemplate
并获得了正常ListViewItem
会使用的ControlTemplate
。
或者,如果有某种方法可以告诉 GridView
根本不改变 ListViewItem
样式,那也适用于我的场景。
这必须在 XAML 内部工作。
看来魔咒是要设置这样的样式:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem"
BasedOn="{StaticResource {x:Type ListBoxItem}}" />
</ListView.ItemContainerStyle>
显然 ListViewItem
本身没有默认样式,但 ListBoxItem
有。
这确实会覆盖 GridView
所做的一切,并使其再次使用普通的 ContentPresenter
。
在 WPF 中,如果我将 GridView
应用于 ListView
,那么它会自动将 ListViewItem
的 Template
属性 更改为ControlTemplate
使用 GridViewRowPresenter
而不是 ContentPresenter
。这通常是您想要的。
不过,碰巧的是,我想保留原始的 ContentPresenter
,这样它将呈现 ListView
的 ItemTemplate
。
(出于好奇:我正在做一个父子关系,其中列实际上用于子元素,所以虽然我仍然有一个 GridViewRowPresenter
,但它位于 ItemTemplate
的 ListView
.)
我 可以 通过在 ListView
上设置 ItemContainerStyle
并在其中设置 Template
属性 来做到这一点自定义 ControlTemplate
,因为这将覆盖 GridView
应用的样式 setter。
然而,这变得非常冗长(尤其是要保留选择颜色)并且它破坏了自然主题支持,除非我为每个主题复制模板,这绝对是愚蠢的。
我真正想做的是这样写:
<Setter Property="Template"
Value="{StaticResource {FindDefaultControlTemplate ListViewItem}}" />
其中后者绕过GridView
设置的ControlTemplate
并获得了正常ListViewItem
会使用的ControlTemplate
。
或者,如果有某种方法可以告诉 GridView
根本不改变 ListViewItem
样式,那也适用于我的场景。
这必须在 XAML 内部工作。
看来魔咒是要设置这样的样式:
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem"
BasedOn="{StaticResource {x:Type ListBoxItem}}" />
</ListView.ItemContainerStyle>
显然 ListViewItem
本身没有默认样式,但 ListBoxItem
有。
这确实会覆盖 GridView
所做的一切,并使其再次使用普通的 ContentPresenter
。