сделать элементы списка в WPF недоступными для выбора - PullRequest
53 голосов
/ 12 ноября 2009

У меня есть список в WPF, и когда они выбирают элемент, он показывает уродливые цвета Могу ли я сделать все предметы невыбираемыми?

Ответы [ 11 ]

91 голосов
/ 12 ноября 2009

Если вам не нужен выбор, используйте ItemsControl вместо ListBox

27 голосов
/ 25 августа 2014

Добавьте свойство Focusable как false в стиле ListBoxItem:

<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
  <!-- Possibly other setters -->
  <Setter Property="Focusable" Value="False" />
</Style>
13 голосов
/ 15 июля 2015

Пожалуйста, используйте это в вашем списке. Я нашел это очень элегантное решение

<ListBox ItemsSource="{Binding YourCollection}">
    <ListBox.ItemContainerStyle>
       <Style TargetType="{x:Type ListBoxItem}">
           <Setter Property="Focusable" Value="False"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
12 голосов
/ 12 ноября 2009

Если вы не хотите, чтобы они выбирались, вам, вероятно, не нужен просмотр списка. Но если это то, что вам действительно нужно, то вы можете сделать это с помощью стиля:

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

Посмотрите на IsSelected Trigger. Вы можете сделать рамку другого цвета, чтобы она не была "Гадкой", или установить ее прозрачной, и она не будет видна при выборе.

Надеюсь, это поможет.

4 голосов
/ 02 сентября 2012

Есть еще более простой способ: установить ListBox свойство IsHitTestVisible="False". Это не позволяет всем элементам в списке получать события мыши. Это дает преимущество в том, что подсветка останавливается при наведении мыши.

У меня работает в WP 7.1.

3 голосов
/ 17 января 2012

Простой способ сделать это (используя ответ из Вики выше) - установить для выбранного индекса значение -1 в SelectionChanged () следующим образом.

public void OnListView_SelectionChanged(Object sender, RoutedEventArgs e)
{
    if (null != sender && sender is ListView)
    {
        ListView lv = sender as ListView;
        lv.SelectedIndex = -1;
    }
}
2 голосов
/ 11 сентября 2013

Лучше избегать событий, более элегантно и без побочных эффектов тег 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>
1 голос
/ 05 января 2011

В случае, если кто-то все еще хочет невыбираемый функционал ListBoxItem (или ListViewItem). http://thrash505.wordpress.com/2011/01/04/non-selectable-listboxitem-or-listviewitem-using-attached-properties/

1 голос
/ 12 ноября 2009

вы можете обработать событие SelectionChanged ListBox и отменить выбор выбранного элемента в обработчике событий.

0 голосов
/ 06 июля 2015

В моем случае я использовал шаблон ListboxItems с Textblock и ComboBox. Единственным «активным» должен быть Combo ...

<ScrollViewer VerticalScrollBarVisibility="Auto"
              HorizontalScrollBarVisibility="Disabled"
              CanContentScroll="True" />
    <ItemsControl>
     ....here my content....
    </Itemscontrol>
</ScrollViewer>

работал на меня, как и ожидалось. BR, Daniel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...