WPF中ListViewItem如何引用默认样式ControlTemplate?

How to reference the default style ControlTemplate for ListViewItem in WPF?

在 WPF 中,如果我将 GridView 应用于 ListView,那么它会自动将 ListViewItemTemplate 属性 更改为ControlTemplate 使用 GridViewRowPresenter 而不是 ContentPresenter。这通常是您想要的。

不过,碰巧的是,我想保留原始的 ContentPresenter,这样它将呈现 ListViewItemTemplate

(出于好奇:我正在做一个父子关系,其中列实际上用于子元素,所以虽然我仍然有一个 GridViewRowPresenter,但它位于 ItemTemplateListView.)

可以 通过在 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