Как изменить шаблон данных WPF Listbox / ListBoxItem для выбранного элемента, БЕЗ влияния на стиль и темы? - PullRequest
1 голос
/ 01 февраля 2010

Этот вопрос очень похож на Изменить WPF DataTemplate ... , который я прочитал и реализовал. Сначала он работал прекрасно, но я столкнулся с проблемой.

Эта проблема заключается в том, что при использовании тем в вашем приложении, таких как темы в проекте WPF Futures (например, Expression Dark), элементы ListBoxItems возвращаются к стилю WPF по умолчанию. Это нарушает тему для этих элементов и, например, создает черный текст на черном фоне, где в противном случае текст будет белым. Это также повлияло на мой TreeView и предположительно повлияло бы на другие подобные элементы управления.

Я думаю, это потому, что для ListBox.ItemContainerStyle устанавливаются конфликтующие стили - один для темы и один для переключения шаблонов данных.

Я искал другие решения, но пока ничего не нашел. Вот какие у меня есть идеи или идеи:

  1. Подклассы DataTemplateSelector и установка его в ListBox.ItemTemplateSelector. (Текущая лучшая ставка).
  2. Каким-то образом где-то используется Trigger, DataTrigger или EventTrigger.
  3. Откажись от темы.
  4. Каким-то образом взломайте нужную мне функциональность в теме.
  5. Каким-то образом заставить мой пользовательский ItemContainerStyle каким-то образом унаследовать его цвета и очарование от стиля темы. (Я попробовал это кратко, и это не сработало.)

Вот мой ListBox и связанные части:

<Window.Resources>

  <DataTemplate x:Key="NormalTemplate">
      ...
  </DataTemplate>

  <DataTemplate x:Key="SelectedTemplate">
      ...
  </DataTemplate>

</Window.Resources>

<ListBox x:Name="RegisterListBox" Grid.Row="0"
         HorizontalContentAlignment="Stretch"
         ItemsSource="{Binding Adjustments}">

    <!-- this is from the post referenced above -->
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="ContentTemplate" Value="{StaticResource NormalTemplate}"/>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

Listbox.DataContext устанавливается в коде для включения привязки ItemsSource.

Есть идеи, как мне достичь описанных выше функций, сохраняя при этом полную поддержку тем?

1 Ответ

5 голосов
/ 01 февраля 2010

Вы пытались сделать что-то подобное?

<ListBox.ItemContainerStyle>
    <Style 
        TargetType="{x:Type ListBoxItem}" 
        BasedOn="{StaticResource {x:Type ListBoxItem}}">    <=====
...

Идея состоит в том, что фреймворк сначала будет искать стиль с ключом, равным typeof(ListBoxItem), он найдет его в темах, а затем ваш стиль просто расширит тематический с вашими конкретными деталями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...