9

GridViewビューを備えたWPFListViewがあり、行のハイライトのトレースを削除したいと思います。

この便利なコードは、このサイトの1つの回答にあります。

     <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の場合、変更する対応するクロムとテンプレートが見つかりません。

4

3 に答える 3

14

Windows SDKがインストールされている場合は、すべての既定のスタイルのXAMLソース(サンプルをインストールしたと仮定)を次の場所に見つけることができます。

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

zipファイルには、デフォルトスタイルのソースを含むAeroTheme、LunaThemeなどを含むCoreフォルダーが含まれています。残念ながら、これらのファイルはかなり大きく(Aeroの場合は約8500行)、構造化やフォーマット(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のみを含む(おそらく単一の境界線にある)独自のものに置き換えることです。コントロールが無効になっているときにアイテムを灰色にするトリガーを含めることを忘れないでください。

于 2009-08-10T09:50:32.237 に答える
8

私は今これをテストするためにWindowsPCの前にいませんが、リストボックスで同様の問題が発生しました。これは、Window.Resourcesに次のように入力することで修正しました。

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

ただし、リストビューで機能するかどうかはわかりません。

于 2009-08-10T02:48:22.417 に答える
0

あなたのコードを使用すると、私はまったく行を見ていません。現在のデフォルトのテーマは何ですか?ルナ、エアロなど?あなたのものが私のものとは異なる可能性があります。したがって、クロムの違いです。あなたに他の特定の設定はありますListViewか?

スタイルスヌーパーまたは表示テンプレートは、表示されている線の原因となる視覚要素を追跡するのに役立つ場合があります。また、必要な効果を得るためにテンプレートを再作成することもできます。ListView

于 2009-08-09T20:24:03.453 に答える