web-dev-qa-db-fra.com

Comment désactiver la surbrillance sur la listbox mais conserver la sélection?

J'ai du mal à trouver comment ne pas autoriser ma ListBox à mettre en surbrillance l'élément sélectionné. Je sais que je n'ai pas ajouté de déclencheur pour mettre en évidence l'élément.

<ListBox Name="CartItems" ItemsSource="{Binding}"
         ItemTemplate="{StaticResource TicketTemplate}" 
         Grid.Row="3" Grid.ColumnSpan="9" Background="Transparent"
         BorderBrush="Transparent">
</ListBox>
35
Aero Chocolate

Réponse tardive, mais il existe une solution bien meilleure et plus simple:

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

Cela vous permet d'avoir une LisBox qui ressemble à un contrôle des éléments, mais prend en charge la sélection.

Edit: Comment cela fonctionne
Cela modifie les "couleurs du système", autrement dit votre thème Windows, uniquement pour ce ListBox et ses enfants (nous voulons en fait cibler le ListboxItem).

Par exemple, le survol d'un ListboxItem lui donne généralement un arrière-plan bleu foncé, mais ici nous le définissons sur transparent (HighlightBrushKey).

Modifier (30 juin 2016):
Il semble que pour la dernière version de Windows, cela ne soit plus suffisant, vous devez également redéfinir InactiveSelectionHighlightBrushKey

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

Merci à @packoman dans les commentaires

45
Louis Kottmann
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="IsSelected" Value="{Binding Content.IsSelected, Mode=TwoWay, RelativeSource={RelativeSource Self}}"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListBox.ItemContainerStyle>
64
Wayne Lo

supprimer complètement la surbrillance semble très étrange, car vous ne savez pas si vous avez sélectionné quelque chose, mais voici une version du modèle de contrôle qui utilise WhiteSmoke (qui est très subtile) au lieu de Blue

<Window.Resources>
    <Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, 
            RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment,
             RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="Padding" Value="2,0,0,0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <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="WhiteSmoke"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <ListBox HorizontalAlignment="Left" VerticalAlignment="Top" ItemContainerStyle="{DynamicResource ListBoxItemStyle1}">
        <ListBoxItem Content="Item1"/>
        <ListBoxItem Content="Item2"/>
        <ListBoxItem Content="Item3"/>
        <ListBoxItem Content="Item4"/>
        <ListBoxItem Content="Item5"/>
        <ListBoxItem Content="Item6"/>
    </ListBox>
</Grid>
6
Dean Chalk

voici ce qui a fonctionné pour moi.

<Style x:Key="ListBoxNoHighlight" TargetType="ListBoxItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border Background="{TemplateBinding Background}">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Transparent"/>
            </Trigger>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Background" Value="Transparent"/>                   
            </Trigger>
        </Style.Triggers>
    </Style>
2
maerzman

Dans l'onglet Propriétés, il y a un champ activé avec 2 options, vrai et faux. En transformant ceci en faux, la Listbox reste blanche et la sélection n'est pas disponible. Je viens de comprendre cela!

1
Dustin Poole

Je parle d'un truc que j'ai fait dans mon application WP8.

J'ai ajouté une image de cadre transparent au-dessus (la bordure de l'image a été vue, pensez-y comme un cadre photo). Le défilement était fonctionnel, tout événement de manipulation se déclenchait simplement parce que les éléments Listbox n'étaient plus sélectionnés.

<Grid 
        Grid.Row="0" 
        Margin="10,15"
        Background="#FF008F88">
        <ListBox 
            x:Name="listBox_content" 
            Margin="20,15"
            VirtualizingStackPanel.VirtualizationMode="Recycling">
        </ListBox>

        <!-- TV image, middle is transparent so the ListBox can be seen -->
        <Image 
                x:Name="image_tv" 
                Source="/Assets/Images/tvFrame.png" 
                Stretch="Fill"/>
        <!---->
    </Grid>

Je suppose que cela pourrait fonctionner avec une image entièrement transparente définie sur Remplir également.

1
JeFawk

Vous devrez reformater ListBoxItem. Dans le modèle par défaut, il a un déclencheur qui se met en évidence lorsque la propriété IsSelected est true. Il vous suffit de créer un modèle qui n'a pas ce déclencheur.

0
decyclone