[.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 제거 (하위 컨트롤 제외) .

프리니