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>
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
<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>
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>
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>
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!
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.
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.