2009-08-09 2 views
8

У меня есть WPF ListView с видом GridView, и я хочу удалить любой след выделения строки.Удаление WPF ListView/GridView highlight chrome

Этот полезный кусок кода можно найти в одном ответе на этом сайте:

 <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Setter Property="Control.Focusable" Value="False"/> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="{x:Null}" /> 
       <Setter Property="BorderBrush" Value="{x:Null}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListView.ItemContainerStyle> 

Однако, в то время как это изменение помогает удалить большую часть блика, он не удаляет турник, который по-прежнему появляется, когда мышь перемещается по строке ListView. Как его удалить?

Я столкнулся с аналогичной проблемой, связанной с Button, и нашел решение, которое изменяет шаблон кнопки, удаляя его хром.

В этом случае ListView/GridView я не могу найти соответствующий хром и шаблон для изменения.

ответ

14

Если у вас установлен Windows SDK, вы можете найти источник XAML для всех стилей по умолчанию (предполагается, что вы установили образцы) в:

% ProgramFiles% \ Microsoft SDKs \ Windows \ v6.1 \ Образцы \ WPFSamples.zip

Почтовый файл содержит папку Core, содержащую AeroTheme, LunaTheme и т. Д., Которые содержат исходные стили по умолчанию. К сожалению, эти файлы довольно большие (~ 8500 строк для Aero) и не очень хорошо структурированы или отформатированы (IMO).

Шаблон управления по умолчанию для ListViewItem выглядит следующим образом:

<ControlTemplate TargetType="{x:Type ListViewItem}"> 
    <Border CornerRadius="2" SnapsToDevicePixels="True" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      Background="{TemplateBinding Background}"> 
    <Border Name="InnerBorder" CornerRadius="1" BorderThickness="1"> 
     <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition MaxHeight="11" /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 

     <Rectangle Name="UpperHighlight" Visibility="Collapsed" Fill="#75FFFFFF" /> 
     <GridViewRowPresenter Grid.RowSpan="2" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
           SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
     </Grid> 
    </Border> 
    </Border> 

    <ControlTemplate.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Background" Value="{StaticResource ListItemHoverFill}" /> 
     <Setter Property="BorderBrush" Value="#FFCCF0FF" /> 
     <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible" /> 
    </Trigger> 

    <Trigger Property="IsSelected" Value="True"> 
     <Setter Property="Background" Value="{StaticResource ListItemSelectedFill}" /> 
     <Setter Property="BorderBrush" Value="#FF98DDFB" /> 
     <Setter TargetName="InnerBorder" Property="BorderBrush" Value="#80FFFFFF" /> 
     <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible" /> 
     <Setter TargetName="UpperHighlight" Property="Fill" Value="#40FFFFFF" /> 
    </Trigger> 

    <MultiTrigger> 
     <MultiTrigger.Conditions> 
     <Condition Property="IsSelected" Value="True" /> 
     <Condition Property="Selector.IsSelectionActive" Value="False" /> 
     </MultiTrigger.Conditions> 

     <Setter Property="Background" Value="{StaticResource ListItemSelectedInactiveFill}" /> 
     <Setter Property="BorderBrush" Value="#FFCFCFCF" /> 
    </MultiTrigger> 

    <MultiTrigger> 
     <MultiTrigger.Conditions> 
     <Condition Property="IsSelected" Value="True" /> 
     <Condition Property="IsMouseOver" Value="True" /> 
     </MultiTrigger.Conditions> 

     <Setter Property="Background" Value="{StaticResource ListItemSelectedHoverFill}" /> 
     <Setter Property="BorderBrush" Value="#FF98DDFB" /> 
    </MultiTrigger> 

    <Trigger Property="IsEnabled" Value="False"> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
    </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Ваш лучший выбор для удаления всех подсвечивание, вероятно, заменить ControlTemplate с вас есть, что именно включает в себя GridViewRowPresenter (может быть в одной границы) , Не забудьте включить триггер, который выгружает элементы, когда элемент управления отключен.

+0

Верхняя подсветка должна быть! Я смотрел шаблон здесь: http://msdn.microsoft.com/en-us/library/ms788717.aspx , и поскольку это должно быть для другой темы, я не мог объяснить панель. – Tony

+0

Я могу подтвердить, что верхний верхний прямоугольник был виновником. Благодаря! – Tony

+2

Удивительно ... только в WPF мне пришлось полностью переопределить стиль, чтобы избавиться от одного элемента подсветки. – aqua

0

Используя ваш код, я не вижу никакой линии вообще. Какова ваша тема по умолчанию прямо сейчас? Луна, Эйро и т. Д.? Может быть, ваше отличается от моего, поэтому разница в хроме. Существуют ли какие-либо другие настройки на вашем ListView?

Style Snooper или Show Me The Template может помочь вам отследить визуальный элемент, отвечающий за линию, которую вы видите. Вы также можете быть заинтересованы в re-templatingListView, чтобы получить эффект, который вы хотите.

+0

Это тема Vista, я считаю, что это Aero, так как у меня есть стеклянные эффекты. Действительно, люди на XP не видят подсветку. – Tony

8

Я не перед ПК с Windows, чтобы проверить это прямо сейчас, но у меня была похожая проблема с ListBoxes, который я установил, помещая следующее в моих Window.Resources

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 

Не уверен, если это будет работать с вашим списком.

+1

Несколько блогов и anwers указывают на этот метод, но по какой-то причине он никогда не работал для меня. – Tony

+3

Спасибо! Это работало для меня, когда я помещал его в свои ресурсы окна с помощью Style targetType = "ListViewItem". Я также добавил строку, чтобы установить SystemColors.HighlightTextBrushKey в SystemColors.WindowTextColor в противном случае, чтобы мой цвет текста не переключился на цвет фона (и, таким образом, исчезнет). –

+0

Для меня это работает в ListView withOUT Gridview. Но НЕ с Гридвью. – Paparazzi

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