Установить стиль GridViewColumnHeader из стиля ListView - PullRequest
6 голосов
/ 04 января 2012

В одном из моих проектов я унаследовал ListView и переопределил стиль, установив новый шаблон элемента управления. Я также переопределил стиль заголовка столбца. До сих пор я нашел два способа сделать это:

1) Установив ключ стиля и сославшись на стиль в GridView:

<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
    <Setter Property="Background" Value="Wheat" />
</Style>

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">

2) Не устанавливая клавишу стиля для вышеуказанного стиля. Теперь мне не нужно ссылаться на стиль в GridView, НО он также переопределяет ВСЕ заголовки списка в моем приложении независимо от типа списка.

Поскольку я использую много списков в своем приложении, я хотел бы сделать это третьим и более гибким способом; установив GridView.ColumnHeaderContainerStyle изнутри стиля ListView. Таким образом, мне не нужно ссылаться на стиль заголовка в каждом GridView. Вот упрощенная версия XAML:

<Window.Resources>
    <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
        <Setter Property="Background" Value="Wheat" />
    </Style>

    <Style TargetType="{x:Type list:MyListView}">
        <Setter Property="GridView.ColumnHeaderContainerStyle" Value="{StaticResource MyHeaderStyle}" />            
        <Setter Property="Background" Value="Linen" />                                   
    </Style>
</Window.Resources>

<list:MyListView>
    <list:MyListView.View>
        <GridView>
            <GridViewColumn Header="Column1" />
            <GridViewColumn Header="Column2" />
        </GridView>
    </list:MyListView.View>
</list:MyListView>

Это, к сожалению, не устанавливает стиль заголовка ... Если я сделаю это изменение в XAML выше, он будет работать:

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 05 января 2012

Спасибо snurre за указание в правильном направлении. Я нашел способ выполнить именно то, что хотел.

Вам не нужно помещать раздел «Ресурсы» в ListView (такого рода пользовательские теги для каждого ListView - это то, от чего я хотел избавиться в первую очередь). Вместо этого ресурсы можно переместить в стиль ListView.

Вот обновленный XAML, который работает именно так, как я хочу:

<Window.Resources>
    <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
        <Setter Property="Background" Value="Wheat" />
    </Style>

    <Style TargetType="{x:Type list:MyListView}">
        <Style.Resources>
            <Style TargetType="{x:Type GridViewColumnHeader}" BasedOn="{StaticResource MyHeaderStyle}" />
        </Style.Resources>

        <Setter Property="Background" Value="Linen" />                                   
    </Style>
</Window.Resources>

<list:MyListView>
    <list:MyListView.View>
        <GridView>
            <GridViewColumn Header="Column1" x:Name="col1" />
            <GridViewColumn Header="Column2" x:Name="col2" />
        </GridView>
    </list:MyListView.View>
</list:MyListView>
3 голосов
/ 04 января 2012

Если ключа нет, он применяется ко всем элементам указанного TargetType. Если у вашего стиля есть ключ, вы должны использовать его явно:

<GridViewColumn HeaderContainerStyle="{StaticResource MyHeaderStyle}" Header="Column1"/>

Кроме того, вы можете установить стиль в пределах вашего ListView, поэтому он применяется только к элементам внутри него:

<list:MyListView>
    <list:MyListView.Resources>
        <Style TargetType="{x:Type GridViewColumnHeader}">
            <Setter Property="Background" Value="Wheat" />
        </Style>
    </list:MyListView.Resources>
</list:MyListView>
...