Удаление WPF ListView / GridView подсветки хрома - PullRequest
8 голосов
/ 09 августа 2009

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

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

     <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, и нашел решение, которое изменяет шаблон Button путем удаления его хрома.

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

Ответы [ 3 ]

14 голосов
/ 10 августа 2009

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

% ProgramFiles% \ Microsoft SDKs \ Windows \ v6.1 \ Samples \ WPFSamples.zip

В 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 (возможно, в одной границе). Не забудьте включить Trigger, который отключает элементы, когда элемент управления отключен.

8 голосов
/ 10 августа 2009

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

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

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

0 голосов
/ 10 августа 2009

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

какие-то особые настройки

Стиль Snooper или Показать мне шаблон может помочь вам отследить визуальный элемент, отвечающий за линию, которую вы видите. Вы также можете быть заинтересованы в повторном шаблоне вашего ListView, чтобы получить желаемый эффект.

...