WPF ListView désactiver la sélection

j'ai une simple WPF ListView et à une question simple:

est-il possible de désactiver la sélection, de sorte que lorsque l'utilisateur clique sur la ligne, celle-ci n'est pas surlignée?

ListView

j'aimerais que la rangée 1 ressemble à la rangée 0 lorsqu'on clique.

peut-être lié: puis-je styliser l'apparence de la hover / sélection? Par exemple. pour remplacer l'air de vol stationnaire de gradient Bleu (Ligne 3) par un solide personnalisé couleur. J'ai trouvé ce et ce , malheureusement pas l'aider.

(réaliser la même chose sans utiliser ListView est également acceptable. J'aimerais pouvoir utiliser le défilement logique et la virtualisation de L'interface utilisateur comme ListView le fait)

le XAML pour ListView est:

<ListView Height="280" Name="listView">
    <ListView.Resources>
        <!-- attempt to override selection color -->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightColorKey}"
                         Color="Green" />
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
                <!-- more columns -->
            </GridView.Columns>
        </GridView>
     </ListView.View>
</ListView>
99
demandé sur ROMANIA_engineer 2009-06-27 00:46:56

10 réponses

selon le commentaire de Martin Konicek, pour désactiver complètement la sélection des articles de la manière la plus simple:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Focusable" Value="false"/>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

cependant si vous avez encore besoin de la fonctionnalité de ListView, comme pouvoir sélectionner un élément, alors vous pouvez désactiver visuellement le style de l'élément sélectionné comme suit:

vous pouvez faire ceci un certain nombre de façons, de changer le Listviewitem's ControlTemplate à simplement définir un style (beaucoup facile.) Vous pouvez créer un style pour les ListViewItems en utilisant le ItemContainerStyle et "éteignez" le pinceau d'arrière-plan et de bordure quand il est sélectionné.

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

aussi, sauf si vous avez un autre moyen de notifier l'utilisateur lorsque l'article est sélectionné (ou juste pour tester), vous pouvez ajouter une colonne pour représenter la valeur:

<GridViewColumn Header="IsSelected"
                DisplayMemberBinding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
118
répondu rmoore 2015-07-14 18:28:37

la réponse de Moore ne fonctionne pas, et la page Ici:

spécifiant la couleur de sélection, L'alignement du contenu et la couleur de fond pour les éléments dans une boîte de liste

explique pourquoi cela ne peut pas fonctionner.

si votre listview ne contient que du texte de base, le moyen le plus simple de résoudre le problème est d'utiliser des brosses transparentes.

<Window.Resources>
  <Style TargetType="{x:Type ListViewItem}">
    <Style.Resources>
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00000000"/>
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#00000000"/>
    </Style.Resources>
  </Style>
</Window.Resources>

cela produira des résultats indésirables si le les cellules de listview contiennent des commandes telles que des comboboxes, car elles changent aussi de couleur. Pour résoudre ce problème, vous devez redéfinir le contrôle du modèle.

  <Window.Resources>
    <Style TargetType="{x:Type ListViewItem}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListViewItem}">
            <Border SnapsToDevicePixels="True" 
                    x:Name="Bd" 
                    Background="{TemplateBinding Background}" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    Padding="{TemplateBinding Padding}">
              <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                    Columns="{TemplateBinding GridView.ColumnCollection}" 
                                    Content="{TemplateBinding Content}"/>
            </Border>
            <ControlTemplate.Triggers>
              <Trigger Property="IsEnabled" 
                       Value="False">
                <Setter Property="Foreground" 
                        Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Window.Resources>
31
répondu Mark Markindale 2017-12-17 19:24:43

définit le style de chaque ListViewItem pour que la mise au point soit définie à false.

<ListView ItemsSource="{Binding Test}" >
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Focusable" Value="False"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>
15
répondu Hayley Guillou 2014-11-07 15:23:15

voici le modèle par défaut pour ListViewItem de Blend:

Modèle Par Défaut De ListViewItem:

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="Selector.IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

il suffit de supprimer le déclencheur et le MultiTrigger IsSelected/IsSelectionActive, en ajoutant le code ci-dessous à votre Style pour remplacer le modèle par défaut, et il n'y aura aucun changement visuel lors de la sélection.

Solution pour désactiver les changements visuels de la propriété sélectionnée:

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
12
répondu Ben Wilde 2013-04-15 20:30:46

la façon la plus facile que j'ai trouvé:

<Setter Property="Focusable" Value="false"/>
11
répondu Martin Konicek 2015-03-11 21:31:39

suite à la solution ci-dessus... J'utiliserais un MultiTrigger pour permettre aux highlights MouseOver de continuer à travailler après la sélection de sorte que le style de votre ListViewItem sera:

        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="True" />
                            <Condition Property="IsMouseOver" Value="False" />
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="Background" Value="{x:Null}" />
                            <Setter Property="BorderBrush" Value="{x:Null}" />
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>
8
répondu Reddog 2009-11-05 20:39:40

l'une des propriétés de listview est IsHitTestVisible . Décochez la case.

5
répondu Jacob Levertov 2016-03-06 14:25:48

D'accord, un peu tard pour le match, mais aucune de ces solutions n'a vraiment fait ce que j'essayais de faire. Ces solutions ont quelques problèmes

  1. Désactiver le ListViewItem, qui vis les styles et désactive tous les enfants contrôles
  2. Supprimer de la pile de test, c'est-à-dire que les contrôles enfants ne reçoivent jamais un clic de souris ou
  3. ne le rend pas focalisable, ça n'a pas marché pour moi?

je voulais un ListView avec les en-têtes de groupe, et chaque ListViewItem devrait être simplement "informationnel" sans sélection ou survoler, mais le ListViewItem a un bouton dedans que je veux pouvoir cliquer et avoir survoler.

donc, ce que je veux vraiment C'est que ListViewItem ne soit pas du tout un ListViewItem, donc, j'ai survolé le template de Controlviewitem et en ai juste fait un simple ContentControl.

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <ContentControl Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"/>
                </ControlTemplate>
            </Setter.Value>
         </Setter>
     </Style>
</ListView.ItemContainerStyle>
5
répondu Bradley Burnside 2016-10-01 18:59:05

utilisez le code ci-dessous:

   <ListView.ItemContainerStyle>
          <Style TargetType="{x:Type ListViewItem}">
           <Setter Property="Background" Value="Transparent`enter code here`" />
             <Setter Property="Template">
               <Setter.Value>
                 <ControlTemplate TargetType="{x:Type ListViewItem}">
                   <ContentPresenter />
                 </ControlTemplate>
               </Setter.Value>
             </Setter>
          </Style>
   </ListView.ItemContainerStyle>
1
répondu Jorge Freitas 2018-02-25 14:28:02

C'est pour les autres qui peuvent rencontrer les exigences suivantes:

  1. remplacer complètement l'indication visuelle de "sélectionné" (par exemple utiliser une forme quelconque), au-delà du simple changement de la couleur du surlignage standard
  2. incluez cette indication sélectionnée dans le DataTemplate avec les autres représentations visuelles de votre modèle, mais,
  3. ne voulez pas avoir à ajouter une propriété "IsSelectedItem" à votre la classe model et être chargée de manipuler manuellement cette propriété sur tous les objets model.
  4. Besoin d'articles pour être sélectionnable dans la liste
  5. voudrait également remplacer la représentation visuelle D'IsMouseOver

si vous êtes comme moi (en utilisant WPF avec .NET 4.5) et a constaté que les solutions impliquant des déclencheurs de style n'ont tout simplement pas fonctionné, voici ma solution:

remplacer le temps de contrôle du ListViewItem dans un style:

<ListView ItemsSource="{Binding MyStrings}" ItemTemplate="{StaticResource dtStrings}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

..Et le Dataemplate:

<DataTemplate x:Key="dtStrings">
        <Border Background="LightCoral" Width="80" Height="24" Margin="1">
            <Grid >
                <Border Grid.ColumnSpan="2" Background="#88FF0000" Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsMouseOver, Converter={StaticResource conBoolToVisibilityTrueIsVisibleFalseIsCollapsed}}"/>
                <Rectangle Grid.Column="0" Fill="Lime" Width="10" HorizontalAlignment="Left" Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsSelected, Converter={StaticResource conBoolToVisibilityTrueIsVisibleFalseIsCollapsed}}" />
                <TextBlock Grid.Column="1" Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" />
            </Grid>
        </Border>
    </DataTemplate>

donne ce résultat à l'exécution (l'item 'B' est sélectionné, l'item' D 'A la souris sur):

ListView appearance

0
répondu BCA 2017-05-18 18:24:52