J'ai une zone de liste dans WPF, et quand ils sélectionnent un élément, il affiche des couleurs moches Puis-je rendre tous les éléments non sélectionnables?
Si vous n'avez pas besoin de sélection, utilisez un ItemsControl
plutôt qu'un ListBox
Ajoutez la propriété Focusable comme false dans le style ListBoxItem:
<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
<!-- Possibly other setters -->
<Setter Property="Focusable" Value="False" />
</Style>
Si vous ne voulez pas qu'ils soient sélectionnables, vous ne voulez probablement pas une vue de liste. Mais si c'est ce dont vous avez vraiment besoin, vous pouvez le faire avec un style:
<Page
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border
Name="Border"
Padding="2"
SnapsToDevicePixels="true">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border" Property="Background" Value="#DDDDDD"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="#888888"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<Grid>
<ListBox>
<ListBoxItem>One</ListBoxItem>
<ListBoxItem>Two</ListBoxItem>
<ListBoxItem>Three</ListBoxItem>
</ListBox>
</Grid>
</Page>
Regardez le déclencheur IsSelected. Vous pouvez rendre la bordure d'une couleur différente afin qu'elle ne soit pas "laide" ou la définir sur transparente et elle ne sera pas visible lorsqu'elle sera sélectionnée.
J'espère que cela t'aides.
Veuillez utiliser ceci dans votre listbox. J'ai trouvé cette solution très élégante
<ListBox ItemsSource="{Binding YourCollection}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Il existe un moyen encore plus simple: définir ListBox
propriété IsHitTestVisible="False"
. Cela empêche tous les éléments de la liste de recevoir des événements de souris. Cela a l'avantage d'arrêter la surbrillance lorsque vous passez la souris également.
Cela fonctionne pour moi dans WP 7.1.
Un moyen simple de le faire (en utilisant la réponse de viky ci-dessus) consiste à définir l'index sélectionné sur -1 dans SelectionChanged (), comme suit.
public void OnListView_SelectionChanged(Object sender, RoutedEventArgs e)
{
if (null != sender && sender is ListView)
{
ListView lv = sender as ListView;
lv.SelectedIndex = -1;
}
}
Mieux vaut éviter les événements, c'est plus élégant et sans effets secondaires le tag Style.
<ListBox>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
... what you want as a source ...
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
vous pouvez gérer l'événement SelectionChanged de ListBox et désélectionner l'élément sélectionné dans le gestionnaire d'événements.
Dans le cas où quelqu'un souhaite toujours la fonctionnalité ListBoxItem (ou ListViewItem) non sélectionnable. http://thrash505.wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/
Dans mon cas, j'avais des modèles ListboxItems avec un Textblock et un ComboBox. Le seul "actif" devrait être le Combo ...
<ScrollViewer VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Disabled"
CanContentScroll="True" />
<ItemsControl>
....here my content....
</Itemscontrol>
</ScrollViewer>
a fonctionné pour moi comme prévu. BR, Daniel
Vous pouvez également créer une zone de liste désactivée, ce qui vous donnera une zone de liste statique et non interactive.
<ListBox IsEnabled="False"/>
Je pense que c'est la solution la plus simple possible.