Подтвердить что ты не робот

Как отключить выделение в списке, но сохранить выбор?

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

Спасибо!

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

Ответ 1

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

<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 в комментариях

Ответ 2

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

Ответ 3

удаление выделения полностью ощущается очень странно, поскольку вы не знаете, выбрали ли вы что-либо, но здесь версия шаблона управления, в которой 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>

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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