移除WPF ListView/GridView的高亮边框

9
我有一个带有GridView视图的WPF ListView,我想删除任何行高亮的痕迹。
这个有用的代码片段可以在该网站的一个答案中找到:
     <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行上时仍会出现水平条。我该如何去掉它?
我曾经遇到过类似的按钮问题,并找到了一种解决方案,即通过删除其chrome来更改按钮模板。
在ListView/GridView的情况下,我无法找到相应的chrome和模板进行更改。
3个回答

14
如果已安装Windows SDK,则可以在以下位置找到所有默认样式的XAML源代码(假设已安装示例):

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

该zip文件包含一个名为Core的文件夹,其中包含AeroTheme、LunaTheme等文件夹,这些文件夹中包含了默认样式的源代码。不幸的是,这些文件相当庞大(Aero文件约有8500行),而且格式结构不是很好(根据个人经验)。
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(可能在单个Border中)。不要忘记在控件禁用时包括将项目置为灰色的触发器。


1
必须使用上面的高亮!我在这里查看了模板:http://msdn.microsoft.com/en-us/library/ms788717.aspx,但由于它可能是针对不同的主题,我无法解释该栏。 - Tony
2
我可以确认 UpperHighlight 矩形是罪魁祸首。谢谢! - Tony
3
太神奇了,只有在 WPF 中我才不得不完全覆盖一个样式来除去一个突出显示的元素。 - aqua

8

我现在没有Windows电脑来测试,但我曾经遇到过类似的列表框问题,通过将以下内容放入我的Window.Resources中解决了问题。

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

不确定它是否适用于您的列表视图。


1
一些博客和答案指向了这种方法,但出于某些原因,它从未对我起作用。 - Tony
3
谢谢!当我将它放在我的窗口资源中,使用样式targetType="ListViewItem"时,它对我起作用。我还添加了一行代码来设置SystemColors.HighlightTextBrushKey为SystemColors.WindowTextColor,以防止我的文本颜色切换到背景颜色(从而消失)。 - Abby Fichtner
对我而言,它在ListView上运作正常且没有GridView。但是,在GridView上却不能正常运作。 - paparazzo

0

使用您的代码,我根本看不到任何线条。您现在的默认主题是什么?Luna,Aero等?可能您的与我的不同,因此chrome上会有差异。您的 ListView 是否有其他特定设置?

Style Snooper Show Me The Template可以帮助您跟踪负责线条的视觉元素。您还可以对 ListView 进行重新模板化以获得所需的效果。


这是Vista主题,我相信它是Aero,因为我有玻璃效果。事实上,XP上的人看不到突出显示条。 - Tony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接