2014-01-27 2 views
1

Я меняю SystemColors.HighlightBrushKey и SystemColors.ControlBrushKey в моем ListView, и он работает хорошо; но это представление списка содержит другие сложные элементы управления в каждом из них ListViewItem (например, другой ListView, DataGrid), и этот новый системный цвет применяется ко всем дочерним элементам управления.Сброс переопределенных SystemColors

<!-- This resource is added to remove the blue highlighting 
     in the selected ListView item. --> 
<SolidColorBrush 
     x:Key="{x:Static SystemColors.HighlightBrushKey}" 
     Color="Transparent" /> 

<!-- This resource is added to remove the background highlighting 
     of the inactive selected ListView item. --> 
<SolidColorBrush 
     x:Key="{x:Static SystemColors.ControlBrushKey}" 
     Color="Transparent" /> 

Есть ли способ сбросить этот цвет системы до исходного для элемента управления, который является дочерним элементом этого ListView?

Фактическая проблема, с которой я сталкиваюсь, заключается в том, что эти переопределенные системные цвета применяются к элементам управления дочернего элемента контекста (из списка ListView); Это прекрасно работает как таковое, но при использовании темы Windows Classic ContextMenus использует эти системные цвета и выглядит странно. Поэтому я надеюсь, что если я смогу переустановить SystemColors на оригинальные, ContextMenu будет работать правильно.

Есть ли другой способ решить эту проблему?

+0

Переопределить шаблон ListViewItem вместо переопределения SystemColors. –

+0

Вы хотите отключить эффект MouseOver? –

+0

Спасибо Rohit, да, это возможно, но у меня есть другой элемент управления ListView и DataGrid, который также требует такого поведения; это самый простой способ применить это поведение ко всем и легче всего поддерживать, не делая его более сложным. – akjoshi

ответ

1

Вы должны переопределить шаблон ListViewItem вместо переопределения SystemColors по умолчанию.

Override шаблона и удалить триггера выбора и MouseOver от него, как это:

<ListView> 
     <ListView.ItemContainerStyle> 
      <Style TargetType="ListViewItem"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ListViewItem"> 
          <Border BorderThickness="{TemplateBinding Border.BorderThickness}" 
            Padding="{TemplateBinding Control.Padding}" 
            BorderBrush="{TemplateBinding Border.BorderBrush}" 
            Background="{TemplateBinding Panel.Background}" 
            Name="Bd" 
            SnapsToDevicePixels="True"> 
           <ContentPresenter Content="{TemplateBinding ContentControl.Content}" 
                ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" 
                ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" 
                HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" 
                VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" 
                SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> 
          </Border> 
          <ControlTemplate.Triggers> 
           <Trigger Property="UIElement.IsEnabled" Value="False"> 
            <Setter Property="TextElement.Foreground" TargetName="Bd"> 
             <Setter.Value> 
              <DynamicResource ResourceKey="{x:Static SystemColors.GrayTextBrushKey}" /> 
             </Setter.Value> 
            </Setter> 
           </Trigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListView.ItemContainerStyle> 
    </ListView> 

Если хочет применить на множественном ListView, положили этот ресурс под App.Resources и использовать там, где это необходимо.

+0

Спасибо, я успешно попробовал аналогичное решение, упомянутое здесь - http://www.tewari.info/2011/04/29/remove-listboxitem-highlighting/; ищем другой доступный вариант. – akjoshi

+0

Хорошо. Только другой способ, о котором я могу думать, - снова переопределить их в ресурсах управления детьми. –

Смежные вопросы