ListBox에서 선택을 비활성화하려면 어떻게합니까?
ListBox에서 선택을 비활성화하려면 어떻게합니까?
답변:
ItemsControl
의 다른 측면이 필요하지 않으면 대신 ListBox
사용할 수 있습니다 ItemsControl
. 항목을 배치 ItemsPanel
하고 선택 개념이 없습니다.
<ItemsControl ItemsSource="{Binding MyItems}" />
기본적 ItemsControl
으로 하위 요소의 가상화는 지원하지 않습니다. 항목이 많은 경우 가상화는 메모리 사용량을 줄이고 성능을 향상시킬 수 있습니다.이 경우 접근 방식 2를 사용하고 스타일을 지정 ListBox
하거나 에 가상화를 추가 할 수 있습니다ItemsControl
.
ListBox
또는 선택 영역이 보이지 않도록 ListBox의 스타일을 지정하십시오.
<ListBox.Resources>
<Style TargetType="ListBoxItem">
<Style.Resources>
<!-- SelectedItem with focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
Color="Transparent" />
<!-- SelectedItem without focus -->
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}"
Color="Transparent" />
<!-- SelectedItem text foreground -->
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}"
Color="Black" />
</Style.Resources>
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
</Style>
</ListBox.Resources>
ItemsControl
을 사용하면 선택 개념이 완전히 제거됩니다.
나는 나를 위해 일하는 매우 간단하고 직접적인 해결책을 찾았습니다.
<ListBox ItemsSource="{Items}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
Focusable = "False"
!
<Setter Property="IsHitTestVisible" Value="False" />
ItemsControl
대신 을 사용하도록 전환 할 수 있습니다 ListBox
. 는 ItemsControl
선택의 개념이 없기 때문에 해제 아무것도 없다.
ItemTemplate
.
고려해야 할 또 다른 옵션은 ListBoxItems를 비활성화하는 것입니다. 다음 스 니펫에 표시된대로 ItemContainerStyle을 설정하면됩니다.
<ListBox ItemsSource="{Binding YourCollection}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsEnabled" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
텍스트를 회색으로 표시하지 않으려면 {x : Static SystemColors.GrayTextBrushKey} 키를 사용하여 스타일의 리소스에 브러시를 추가하여 비활성화 된 색상을 지정할 수 있습니다. 다른 솔루션은 ListBoxItem 컨트롤 템플릿을 재정의하는 것입니다.
여기에 꽤 좋은 답변이 있지만 약간 다른 것을 찾고있었습니다. 선택을 원하지만 선택하거나 다른 문제로 표시하고 싶지 않습니다.
위의 솔루션은 (완전히) 작동하지 않았으므로 다른 작업을 수행했습니다. 목록 상자에 새로운 스타일을 사용하여 템플릿을 완전히 재정의했습니다.
<Style x:Key="PlainListBoxStyle" TargetType="ListBox">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<ItemsPresenter/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
그것부터 시작하여 자신만의 선택 강조 표시를 쉽게 추가하거나 전혀 원하지 않는 경우 그대로 두십시오.
@Drew Noakes의 답변은 대부분의 경우 빠른 솔루션이지만 x : Static 브러쉬 설정과 관련하여 약간의 결함이 있습니다.
제안 된대로 x : Static 브러쉬를 설정하면 목록 상자 항목 내의 모든 자식 컨트롤이이 스타일을 상속합니다.
이는 목록 상자 항목의 강조 표시를 비활성화하는 데 효과적이지만 하위 컨트롤에 원하지 않는 결과를 초래할 수 있음을 의미합니다.
예를 들어, ListBoxItem 내에 ComboBox가 있으면 ComboBox 내에서 마우스 커서를 강조 표시하지 않습니다.
대신,이 스택 오버 플로우 스레드에서 언급 한 솔루션에서 다루는대로 Selected, Unselected 및 MouseOver 이벤트의 VisualStates 설정을 고려 하십시오 . ListBoxItem에서 Control Highlight 제거 (하위 컨트롤 제외) .
프리니
또 다른 해결책을 제안합니다. 간단하게 다시 템플릿은 ListBoxItem
더 이상 아무것도하기 ContentPresenter
때문에 같은 ...
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
이 접근법에 대한 나의 이유는 다음과 같습니다.
제 경우에는 내용과의 사용자 상호 작용을 비활성화하고 싶지 ListBoxItems
않으므로 설정할 솔루션이 IsEnabled
작동하지 않습니다.
ListBoxItem
색상 관련 속성을 재정 의하여 스타일을 다시 시도하는 다른 솔루션 은 템플릿이 해당 속성을 사용하는 인스턴스에서만 작동합니다. 기본 스타일에는 문제가 없지만 사용자 정의 스타일에는 영향을줍니다.
표준 과 완전히 다른 모양 을 가지고 가상화를 지원하지 않기 ItemsControl
때문에 너무 많은 다른 것들을 사용하는 솔루션 은 어쨌든 다시 템플릿해야 합니다.ItemsControl
ListBox
ItemsPanel
위의 기본 모양은 변경 ListBox
되지 않으며의 데이터 템플릿에서 항목을 비활성화하지 않으며 ListBox
기본적으로 가상화를 지원하며 앱에서 사용 중이거나 사용하지 않을 수있는 스타일에 관계없이 작동합니다. 이것이 KISS 원칙입니다.
참고 :이 솔루션은 키보드 탐색 또는 마우스 오른쪽 버튼 클릭 (예 : 화살표 키 다음에 스페이스 키)으로 선택을 비활성화하지 않습니다 .
이전의 모든 답변은 선택 기능을 완전히 제거하거나 (런타임 전환 없음) 시각적 효과를 제거하지만 선택은 제거하지 않습니다.
그러나 사용자 입력이 아닌 코드로 선택을 선택하고 표시하려면 어떻게해야합니까? 전체 Listbox를 비활성화하지 않고 사용자 선택을 "고정"하고 싶습니까?
해결책은 전체 ItemsContentTemplate을 시각적 크롬이없는 Button으로 감싸는 것입니다. 버튼의 크기는 항목의 크기와 같아야하므로 완전히 덮습니다. 이제 버튼의 IsEnabled-Property를 사용하십시오.
항목의 선택 상태를 "고정"하려면 단추를 활성화하십시오. 활성화 된 버튼이 모든 마우스 이벤트를 ListboxItem-Eventhandler로 버블 링하기 전에 먹기 때문에 작동합니다. ItemsDataTemplate은 단추 내용의 일부이기 때문에 여전히 MouseEvents를 수신합니다.
클릭하여 선택 항목을 변경하려면 단추를 비활성화하십시오.
<Style x:Key="LedCT" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Button IsEnabled="{Binding IsSelectable, Converter={StaticResource BoolOppositeConverter}}" Template="{DynamicResource InvisibleButton}">
<ContentPresenter />
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ControlTemplate x:Key="InvisibleButton" TargetType="{x:Type Button}">
<ContentPresenter/>
</ControlTemplate>
다 트랙스
ItemsControl의 모든 기능이 필요할 수 있습니까? 선택을 허용하지 않습니다 :
<ItemsControl ItemsSource="{Binding Prop1}" ItemTemplate="{StaticResource DataItemsTemplate}" />
나는 완벽한 길을 찾았다.
사용자가 마우스를 가리 키거나 아래로 스크롤하거나 위로 스크롤 할 수 없도록 ListBox IsHitTestVisible을 false로 설정하십시오.
Capture PreviewGotKeyboardFocus e.Handled = true이므로 키보드 탭, 위쪽 화살표, 아래쪽 화살표로 항목을 선택할 수 있습니다.
이 방법의 장점 :
xmal
<ListBox Name="StudentsListBox" ItemsSource="{Binding Students}" ScrollViewer.VerticalScrollBarVisibility="Disabled" ScrollViewer.HorizontalScrollBarVisibility="Disabled" BorderThickness="0" Background="Transparent" IsHitTestVisible="False" PreviewGotKeyboardFocus="StudentsListBox_PreviewGotKeyboardFocus">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Padding" Value="0"/>
<Setter Property="Margin" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border x:Name="Bd">
<ContentPresenter/>
</Border>
<ControlTemplate.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Selector.IsSelectionActive" Value="False" />
<Condition Property="IsSelected" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="Yellow" />
<Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Name="GradeBlock" Text="{Binding Grade}" FontSize="12" Margin="0,0,5,0"/>
<TextBlock Grid.Column="1" Name="NameTextBlock" Text="{Binding Name}" FontSize="12" TextWrapping="Wrap"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
암호
private void StudentsListBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
e.Handled = true;
}
나에게 가장 좋은 해결책은 다음과 같습니다.
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="True"/>
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
IsEnabled = 거짓