WPF ListView отключить выбор

У меня есть простой WPF ListView и простой вопрос:

Можно ли отключить выделение, чтобы, когда пользователь щелкает строку, строка не выделялась?

ListView

Я хотел бы, чтобы строка 1 выглядела как строка 0 при нажатии.

Возможно связано: могу ли я стилизовать вид наведения / выделения? Например. заменить синий вид градиента при наведении курсора (строка 3) на собственный сплошной цвет. я нашелэтот а такжеэтотК сожалению не помогает.

(Достижение того же самого без использования ListView также приемлемо. Я просто хотел бы иметь возможность использовать логическую прокрутку и виртуализацию пользовательского интерфейса, как это делает ListView)

XAML для ListView:

<code><ListView Height="280" Name="listView">
    <ListView.Resources>
        <!-- attempt to override selection color -->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightColorKey}"
                         Color="Green" />
    </ListView.Resources>
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
                <!-- more columns -->
            </GridView.Columns>
        </GridView>
     </ListView.View>
</ListView>
</code>
 James McConnell26 июн. 2009 г., 22:51
Я никогда ранее не использовал ListView в WPF, но я уверен, что есть какое-то свойство IsEnabled, которое, если установлено в false, отключило бы весь элемент управления и, вероятно, достигло бы того, что вы хотите, но я не уверен на 100%.
 Martin Konicek26 июн. 2009 г., 22:57
Привет, да, есть свойство IsEnabled, которое может отключить весь ListView. Мне нужно, чтобы ListView работал нормально, просто не отображать выбор.

Ответы на вопрос(11)

Код ниже отключает выбор строки ListViewItem, а также позволяет добавлять отступы, поля и т. Д.

<ListView.ItemContainerStyle>                                                                              
   <Style TargetType="ListViewItem">                                                                                      
       <Setter Property="Template">                                                                                            
         <Setter.Value>                                                                                             
           <ControlTemplate TargetType="{x:Type ListViewItem}">                                                                                                    
              <ListViewItem Padding="0" Margin="0">                                                                                                        
                  <ContentPresenter />
              </ListViewItem>
           </ControlTemplate>                                                          
         </Setter.Value>                                                                                       
         </Setter>
      </Style>                                                                      
  </ListView.ItemContainerStyle> 

Самый простой способ, который я нашел:

<Setter Property="Focusable" Value="false"/>
 16 апр. 2015 г., 22:04
не работает :(
 20 мая 2015 г., 14:27
@ Mutex Это работает - вы должны применить это наListView.ItemContainerStyle хоть!

Установите стиль каждого ListViewItem, чтобы Focusable был установлен в false.

<ListView ItemsSource="{Binding Test}" >
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Focusable" Value="False"/>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>
 10 мар. 2015 г., 15:29
Просто и эффективно. И он на самом деле делает то, что просят: он отключает выбор, а не просто скрывает его. Это лучший ответ.

Вот шаблон по умолчанию для ListViewItem из Blend:

Шаблон ListViewItem по умолчанию:

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListViewItem}">
                    <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="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="Selector.IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}}"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

Просто удалите IsSelected Trigger и IsSelected / IsSelectionActive MultiTrigger, добавив приведенный ниже код в свой стиль, чтобы заменить шаблон по умолчанию, и при выборе визуального изменения не будет.

Решение отключить визуальные изменения свойства IsSelected:

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListViewItem}">
                <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="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

Используйте код ниже:

   <ListView.ItemContainerStyle>
          <Style TargetType="{x:Type ListViewItem}">
           <Setter Property="Background" Value="Transparent`enter code here`" />
             <Setter Property="Template">
               <Setter.Value>
                 <ControlTemplate TargetType="{x:Type ListViewItem}">
                   <ContentPresenter />
                 </ControlTemplate>
               </Setter.Value>
             </Setter>
          </Style>
   </ListView.ItemContainerStyle>

Ладно, немного поздно в игре, но ни одно из этих решений не совсем то, что я пытался сделать. У этих решений есть пара проблем

Disable the ListViewItem, which screws up the styles and disables all the children controls Remove from the hit-test stack, i.e. children controls never get a mouse-over or click Make it not focusable, this just plain didn't work for me?

Я хотел ListView с заголовками группировки, и каждый ListViewItem должен быть просто «информационным». без выделения или при наведении курсора, но в ListViewItem есть кнопка, которую я хочу, чтобы у меня была возможность щелчка мышью и при наведении курсора.

Итак, на самом деле я хочу, чтобы ListViewItem вообще не был ListViewItem, поэтому я перебрал ControlTemplate ListViewItem и просто сделал его простым ContentControl.

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <ContentControl Content="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"/>
                </ControlTemplate>
            </Setter.Value>
         </Setter>
     </Style>
</ListView.ItemContainerStyle>
Решение Вопроса

Комментарий Мартина Коничека, чтобы полностью отключить выбор элементов самым простым способом:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="Focusable" Value="false"/>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

Однако если вам все еще требуется функциональность ListView, например, возможность выбирать элемент, вы можете визуально отключить стилизацию выбранного элемента, например, так:

Вы можете сделать это несколькими способами, от изменения ListViewItem.ControlTemplate просто установить стиль (намного проще). Вы можете создать стиль для ListViewItems, используяItemContainerStyle и «выключить»; кисть фона и границы, когда она выбрана.

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Style.Triggers>
                <Trigger Property="IsSelected"
                         Value="True">
                    <Setter Property="Background"
                            Value="{x:Null}" />
                    <Setter Property="BorderBrush"
                            Value="{x:Null}" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

Кроме того, если у вас нет другого способа уведомления пользователя, когда элемент выбран (или только для тестирования), вы можете добавить столбец для представления значения:

<GridViewColumn Header="IsSelected"
                DisplayMemberBinding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListViewItem}}, Path=IsSelected}" />
 26 июн. 2009 г., 23:23
Не видел связанной части, но вы можете сделать то же самое, установив фон и границу, как вам нравится, в свойстве IsMouseOver.
 10 сент. 2014 г., 04:07
@MartinKonicek Я должен был добавитьBasedOn="{StaticResource {x:Type ListViewItem}}" поэтому он не переопределяет остальные стили моей сетки, но я также думаю, что вы должны сделать свой комментарий принятым ответом
 27 сент. 2013 г., 16:57
@MartinKonicek Я знаю, что это старый пост, но ваш высокий рейтинг должен быть ответом;)
 Martin Konicek27 июн. 2009 г., 00:48
Теперь я решил эту проблему еще лучше - & lt; Setter Property = & quot; Focusable & quot; Значение = & Quot; ложно & Quot; / & GT; полностью отключает выбор строки.
 27 июн. 2009 г., 01:03
Аааа, я думал, ты имел в виду просто выключить Выбор визуально. Если вы вообще не хотите, чтобы они были выделены, вы, возможно, захотите взглянуть на использование ItemsControl (поскольку вы по-прежнему можете устанавливать выбранные элементы с помощью кода, если они не могут быть сфокусированы), хотя для того, чтобы сетка выглядела, вы ; мне придется сделать что-то вроде этого: manicprogrammer.com/cs/blogs/… Кроме того, если вы еще этого не сделали, вы можете обратиться к книге WPF Unleashed, так как она представляет собой отличное введение в WPF & amp; XAML.

В дополнение к решению, приведенному выше ... я бы использовал MultiTrigger, чтобы позволить выделениям MouseOver продолжать работать после выбора таким образом, чтобы стиль вашего ListViewItem был:

        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Style.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsSelected" Value="True" />
                            <Condition Property="IsMouseOver" Value="False" />
                        </MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="Background" Value="{x:Null}" />
                            <Setter Property="BorderBrush" Value="{x:Null}" />
                        </MultiTrigger.Setters>
                    </MultiTrigger>
                </Style.Triggers>
            </Style>
        </ListView.ItemContainerStyle>

Это для тех, кто может столкнуться со следующими требованиями:

Completely replace the visual indication of "selected" (e.g. use some kind of shape), beyond just changing the color of the standard highlight Include this selected indication in the DataTemplate along with the other visual representations of your model, but, Don't want to have to add an "IsSelectedItem" property to your model class and be burdened with manually manipulating that property on all model objects. Require items to be selectable in the ListView Also would like to replace the visual representation of IsMouseOver

Если вы мне нравитесь (используя WPF с .NET 4.5) и обнаружили, что решения, включающие триггеры стилей, просто не работают, вот мое решение:

Замените ControlTemplate объекта ListViewItem в стиле:

<ListView ItemsSource="{Binding MyStrings}" ItemTemplate="{StaticResource dtStrings}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <ContentPresenter/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

..И DataTemplate:

<DataTemplate x:Key="dtStrings">
        <Border Background="LightCoral" Width="80" Height="24" Margin="1">
            <Grid >
                <Border Grid.ColumnSpan="2" Background="#88FF0000" Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsMouseOver, Converter={StaticResource conBoolToVisibilityTrueIsVisibleFalseIsCollapsed}}"/>
                <Rectangle Grid.Column="0" Fill="Lime" Width="10" HorizontalAlignment="Left" Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListViewItem}, Path=IsSelected, Converter={StaticResource conBoolToVisibilityTrueIsVisibleFalseIsCollapsed}}" />
                <TextBlock Grid.Column="1" Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White" />
            </Grid>
        </Border>
    </DataTemplate>

Результатом этого во время выполнения (элемент 'B' выбран, элемент 'D' имеет курсор мыши):

ListView appearance

Ответ Мура не работает, и страница здесь:

Задание цвета выделения, выравнивания содержимого и цвета фона для элементов в ListBox

объясняет, почему это не может работать.

Если ваш список содержит только основной текст, самый простой способ решить эту проблему - использовать прозрачные кисти.

<Window.Resources>
  <Style TargetType="{x:Type ListViewItem}">
    <Style.Resources>
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="#00000000"/>
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#00000000"/>
    </Style.Resources>
  </Style>
</Window.Resources>

Это приведет к нежелательным результатам, если ячейки списка содержат элементы управления, такие как комбинированные списки, поскольку это также меняет их цвет. Чтобы решить эту проблему, вы должны переопределить шаблон элемента управления.

  <Window.Resources>
    <Style TargetType="{x:Type ListViewItem}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListViewItem}">
            <Border SnapsToDevicePixels="True" 
                    x:Name="Bd" 
                    Background="{TemplateBinding Background}" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    Padding="{TemplateBinding Padding}">
              <GridViewRowPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                    Columns="{TemplateBinding GridView.ColumnCollection}" 
                                    Content="{TemplateBinding Content}"/>
            </Border>
            <ControlTemplate.Triggers>
              <Trigger Property="IsEnabled" 
                       Value="False">
                <Setter Property="Foreground" 
                        Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
              </Trigger>
            </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>
  </Window.Resources>
 07 окт. 2011 г., 16:48
+1 для ListViewItem ControlTemplate
 09 июл. 2012 г., 05:07
Это делает все мои элементы в моем ListView исчезают

Одним из свойств списка являетсяIsHitTestVisible. Uncheck it.

 22 нояб. 2018 г., 07:37
У меня есть шаблон кнопки внутри шаблона списка. если отменить выборIsHitTestVisible кнопка не может быть нажата. Это действует какIsEnabled = false;
 23 авг. 2017 г., 08:55
Простой и эффективный, также решить мою проблему с ScrollViewer обернутым боковой вид списка.

Ваш ответ на вопрос