[.net] ListBox.SelectionMode =“None”이 없습니다. 목록 상자에서 선택을 비활성화하는 다른 방법이 있습니까?
ListBox에서 선택을 비활성화하려면 어떻게합니까?
답변
접근법 1- ItemsControl
의 다른 측면이 필요하지 않으면 대신 ListBox
사용할 수 있습니다 ItemsControl
. 항목을 배치 ItemsPanel
하고 선택 개념이 없습니다.
<ItemsControl ItemsSource="{Binding MyItems}" />
기본적 ItemsControl
으로 하위 요소의 가상화는 지원하지 않습니다. 항목이 많은 경우 가상화는 메모리 사용량을 줄이고 성능을 향상시킬 수 있습니다.이 경우 접근 방식 2를 사용하고 스타일을 지정 ListBox
하거나 에 가상화를 추가 할 수 있습니다ItemsControl
.
접근법 2-스타일링 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>
답변
나는 나를 위해 일하는 매우 간단하고 직접적인 해결책을 찾았습니다.
<ListBox ItemsSource="{Items}">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Focusable" Value="False"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
답변
ItemsControl
대신 을 사용하도록 전환 할 수 있습니다 ListBox
. 는 ItemsControl
선택의 개념이 없기 때문에 해제 아무것도 없다.
답변
고려해야 할 또 다른 옵션은 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 컨트롤 템플릿을 재정의하는 것입니다.
답변
itemscontrol 대신 listbox를 사용해야하는 경우에도 작동하지만 선택할 수 없어야하는 항목 만 표시하고 있습니다.
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="IsHitTestVisible" Value="False" />
</Style>
</ListBox.ItemContainerStyle>
답변
여기에 꽤 좋은 답변이 있지만 약간 다른 것을 찾고있었습니다. 선택을 원하지만 선택하거나 다른 문제로 표시하고 싶지 않습니다.
위의 솔루션은 (완전히) 작동하지 않았으므로 다른 작업을 수행했습니다. 목록 상자에 새로운 스타일을 사용하여 템플릿을 완전히 재정의했습니다.
<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 제거 (하위 컨트롤 제외) .
프리니