Как отключить подсветку в списке, но сохранить выбор? - PullRequest
32 голосов
/ 03 декабря 2010

У меня возникают проблемы с поиском, как не разрешить моему ListBox выделять выбранный элемент. Я знаю, что не добавил триггер для выделения элемента.

<ListBox Name="CartItems" ItemsSource="{Binding}"
         ItemTemplate="{StaticResource TicketTemplate}" 
         Grid.Row="3" Grid.ColumnSpan="9" Background="Transparent"
         BorderBrush="Transparent">
</ListBox>

Ответы [ 6 ]

55 голосов
/ 15 апреля 2015
        <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>
45 голосов
/ 23 января 2012

Поздний ответ, но есть гораздо лучшее и более простое решение:

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

Это позволяет вам иметь LisBox, который выглядит так же, как itemscontrol, но имеет поддержку выбора.

Редактировать: Как это работаетЭто изменяет «цвета системы», другими словами, вашу тему Windows, только для этого ListBox и его дочерних элементов (мы на самом деле хотим нацелить ListboxItem).

Например, наведение ListboxItem обычно даетэто синий фон, но здесь мы устанавливаем его прозрачным (HighlightBrushKey).

Редактировать (30 июня 2016 г.): Кажется, для последней версии Windows этого уже недостаточно, вам также нужно переопределить InactiveSelectionHighlightBrushKey

<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Transparent" />

Спасибо @packoman в комментариях

5 голосов
/ 03 декабря 2010

удаление выделения полностью кажется очень странным, так как вы не знаете, выбрали ли вы что-нибудь, но вот версия шаблона элемента управления, которая использует WhiteSmoke (который очень тонкий) вместо 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>
1 голос
/ 06 марта 2014

Я говорю о трюке, который я сделал в своем приложении WP8.

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

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

Полагаю, это может работать и с полностью прозрачным изображением, установленным на Fill.

1 голос
/ 07 июня 2012

На вкладке «Свойства» имеется поле «Включено» с двумя параметрами: «истина» и «ложь».Если установить для этого параметра значение false, список остается белым, а выбор недоступен.Просто понял это!

0 голосов
/ 03 декабря 2010

Вам придется повторно шаблон ListBoxItem. В шаблоне по умолчанию он имеет триггер, который подсвечивается, когда свойство IsSelected имеет значение true. Вам просто нужно создать шаблон, который не имеет этого триггера.

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