bestsource

WPF의 목록 상자 항목을 선택할 수 없도록 설정

bestsource 2023. 4. 9. 21:48
반응형

WPF의 목록 상자 항목을 선택할 수 없도록 설정

WPF에 리스트 박스가 있는데 아이템을 선택하면 보기 흉한 색상이 나타납니다.모든 아이템을 선택 불가로 할 수 있습니까?

선택이 필요 없는 경우,ItemsControl가 아니라ListBox

ListBoxItem 스타일에 Focusable 속성을 false로 추가합니다.

<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
  <!-- Possibly other setters -->
  <Setter Property="Focusable" Value="False" />
</Style>

이것을 리스트 박스내에서 사용해 주세요.나는 이 매우 우아한 해결책을 발견했다.

<ListBox ItemsSource="{Binding YourCollection}">
    <ListBox.ItemContainerStyle>
       <Style TargetType="{x:Type ListBoxItem}">
           <Setter Property="Focusable" Value="False"/>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

선택할 수 없는 경우 목록 보기를 원하지 않을 수 있습니다.그러나 이것이 정말로 필요한 것이라면, 스타일링으로 할 수 있습니다.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Page.Resources>


<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type ListBoxItem}">
        <Border 
          Name="Border"
          Padding="2"
          SnapsToDevicePixels="true">
          <ContentPresenter />
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsSelected" Value="true">
            <Setter TargetName="Border" Property="Background" Value="#DDDDDD"/>
          </Trigger>
          <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="#888888"/>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

  </Page.Resources>
  <Grid>  
    <ListBox>
      <ListBoxItem>One</ListBoxItem>
      <ListBoxItem>Two</ListBoxItem>
      <ListBoxItem>Three</ListBoxItem>
    </ListBox>
  </Grid>
</Page>

IsSelected 트리거를 확인합니다.테두리를 다른 색으로 만들어 "Ugly"가 되지 않도록 하거나 투명하게 설정할 수 있으며, 선택하면 테두리가 표시되지 않습니다.

이게 도움이 됐으면 좋겠다.

더 쉬운 방법이 있습니다. 세트ListBox소유물IsHitTestVisible="False"이렇게 하면 목록의 모든 항목이 마우스 이벤트를 수신할 수 없습니다.이렇게 하면 마우스를 위로 가져가도 강조 표시가 중지된다는 장점이 있습니다.

WP 7.1에서는 동작합니다.

이를 위한 간단한 방법(위 viky의 답변 사용)은 다음과 같이 Selection Changed()에서 선택한 인덱스를 -1로 설정하는 것입니다.

public void OnListView_SelectionChanged(Object sender, RoutedEventArgs e)
{
    if (null != sender && sender is ListView)
    {
        ListView lv = sender as ListView;
        lv.SelectedIndex = -1;
    }
}

이벤트를 피하는 것이 보다 우아하고 스타일 태그의 부작용이 없습니다.

<ListBox>
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="IsEnabled" Value="False"/>
    </Style>
  </ListBox.ItemContainerStyle>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel>
        ... what you want as a source ...
       </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

ListBox의 SelectionChanged 이벤트를 처리하고 이벤트 핸들러에서 선택한 항목을 선택 해제할 수 있습니다.

Listbox를 비활성화할 수도 있습니다.이것에 의해, 스태틱하고 인터랙티브하지 않은 리스트 박스가 표시됩니다.

<ListBox IsEnabled="False"/>

저는 이것이 가능한 한 간단한 해결책이라고 생각합니다.

저는 텍스트 블록과 콤보 박스로 리스트 박스 아이템을 템플릿으로 만들었습니다.유일한 "액티브"는 콤보...

<ScrollViewer VerticalScrollBarVisibility="Auto"
              HorizontalScrollBarVisibility="Disabled"
              CanContentScroll="True" />
    <ItemsControl>
     ....here my content....
    </Itemscontrol>
</ScrollViewer>

기대했던 대로 효과가 있었어요.BR, 다니엘

미리보기를 처리할 수도 있습니다.마우스 다운 이벤트

그리고 탭 방지를 위해KeyboardNavigation.TabNavigation="None"

<ListView x:Name="Cards"
            .....
            PreviewMouseDown="CardMonthsDescriptors_OnPreviewMouseDown"
            KeyboardNavigation.TabNavigation="None"
>
...
private void Cards_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
        {
            e.Handled = true;
        }

언급URL : https://stackoverflow.com/questions/1722456/make-listbox-items-in-wpf-not-selectable

반응형