2009-11-15 6 views
7

나는 ListBox를 가지고있다. 내부 ScrollViewer가있어서 마우스 휠로 ListBox 내용을 스크롤 할 수 있습니다. 다른 ListBox를 포함하는 항목 템플릿을 설정할 때까지 제대로 작동합니다 (실제로 4 개의 중첩 ListBox =)). 문제는 내부 ListBox의 ScrollViewer가 휠링 이벤트를 훔치는 것입니다. 이 문제를 방지하는 쉬운 방법이 있습니까?ListBox에서 ScrollViewer를 비활성화하는 방법은 무엇입니까?


내가 이런 ItemContainerStyle와 목록 상자를했다 :

<Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="BorderBrush" Value="Black"/> 
    ... 
</Style> 
<ListBox ItemContainerStyle="{StaticResource ListBoxItemStyle}" /> 

어떻게 이런 자원 ItemContainer의 항목 테두리 스타일을 설정할 수 있습니까? ContentPresenter는 ItemsControl의 항목 컨테이너입니다. 하지만 테두리가 없으므로 스타일을 지정할 수 없습니다.

답변

40

당신은 훨씬 더 간단 뭔가의 컨트롤 템플릿을 변경하여 ListBox에서 ScrollViewer을 제거 할 수 있습니다

<ListBox> 
    <ListBox.Template> 
     <ControlTemplate> 
      <ItemsPresenter /> 
     </ControlTemplate> 
    </ListBox.Template> 
    ... 
</ListBox> 

는 그러나, 나는 중첩리스트 박스의 값을 질문입니다. 각 ListBox은 셀렉터이며 항목이 "선택됨"이라는 개념을 가지고 있습니다. 선택한 항목을 선택한 항목 내에서 선택한 항목 안에 포함시키는 것이 실제로 의미가 있습니까?

"내부"ListBoxes을 간단한 ItemsControls으로 변경하여 중첩 목록에 항목을 선택할 수 없도록 제안합니다. 그러면 훨씬 간단한 사용자 환경을 만들 수 있습니다. 스크롤바를 제거하는 것과 같은 방법으로 ItemsControls 내부 서식을 다시 지정해야 할 수도 있지만, 적어도 사용자는 어떤 항목이 "선택"되었는지 혼동하지 않을 것입니다.

+0

_Does 그것이 정말 선택한 항목 내부 의미가 선택한 항목 내에서 선택한 항목을 가질 수 있도록 _ 예. 목록 안의 목록 안의 목록에서 항목을 선택하려면 어떻게해야합니까? – wotanii

+0

또한 목록 상자에서 다른 많은 항목을 제거합니다 (예 : 드롭 이벤트 – wotanii

0

죄송합니다. 사실 ScrollViewer의 연결된 속성을 사용하여 ScrollViewer를 사용하지 않도록 설정할 수 있습니다.

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
     ScrollViewer.VerticalScrollBarVisibility="Disabled" ... 
</ListBox> 
+4

이것은 여전히 ​​바퀴 달린 이벤트를 훔치는 것 같다 – wotanii

+0

그것은 나를 위해 작동하지 않습니다 : ( – Sam

+0

그것은 나를 위해 너무 작동하지 않습니다. – Eftekhari

-1

사용할 수 있습니다! 바퀴 도둑 맞지 않아.

<ListBox ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
    ScrollViewer.VerticalScrollBarVisibility="Disabled" ... 
</ListBox> 
1

당신은 XAML에서 스크롤 이벤트를 잡기로 스크롤 이벤트를 훔치는 해제 할 수 있습니다

<ListBox PreviewMouseWheel="ScrollViewer_PreviewMouseWheel"> 

을 뒤에 코드에서 다시 게시 :

private void ScrollViewer_PreviewMouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     if (sender is ListBox && !e.Handled) 
     { 
      e.Handled = true; 
      var eventArg = new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta); 
      eventArg.RoutedEvent = UIElement.MouseWheelEvent; 
      eventArg.Source = sender; 
      var parent = ((Control)sender).Parent as UIElement; 
      parent.RaiseEvent(eventArg); 
     } 
    } 

이 솔루션은 정확히옵니다입니다, 그것은 ListView와 나를 도왔다.

내가 여기이 해결책을 발견 :

https://social.msdn.microsoft.com/Forums/vstudio/en-US/3a3bb6b0-e088-494d-8ef2-60814415fd89/swallowing-mouse-scroll?forum=wpf

관련 문제