web-dev-qa-db-fra.com

rendre les éléments de la zone de liste dans WPF non sélectionnables

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?

56
Ghassan Karwchan

Si vous n'avez pas besoin de sélection, utilisez un ItemsControl plutôt qu'un ListBox

91
Thomas Levesque

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>
29
Vadym Kyrylkov

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.

14
4imble

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>
13
Asad Durrani

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.

5
Denise Draper

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;
    }
}
3
tornacious

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>
2
user1630939

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.

1
viky

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/

1
Tim Valentine

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

0
dba

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.

0
Lazys