2009-11-15 31 views
7

ListBox'ım var. Dahili ScrollViewer var, bu yüzden fare tekerleği ile ListBox içeriğini kaydırmak. Ben başka bir liste kutusu (aslında, 4 yuvalanmış ListBoxes =)) içeren madde şablonu ayarlamak kadar iyi çalışır. Sorun şu ki, Listbox'ın ScrollViewer'ı wheeling olayı çalıyor. Bu davranışı önlemek için herhangi bir kolay yolu var mı?ListBox'ta ScrollViewer nasıl devre dışı bırakılır?


böyle ItemContainerStyle ile ListBox vardı:

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

böyle nasıl kaynaklarda ItemContainer en öğe sınır için stil ayarlayabilirsiniz? Bildiğim kadarıyla ContentPresenter, ItemsControl öğesinin konteyneridir. Ama sınır yok, bu yüzden stil alamıyorum.

cevap

40

Çok daha basit bir şey olan, kontrol şablonunu değiştirerek ListBox den ScrollViewer kaldırabilirsiniz:

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

Ancak, yuvalama ListBoxes değerini sorgular. Her bir ListBox'un bir Seçici olduğunu ve hangi öğenin "seçildiği" kavramını içerdiğini unutmayın. Seçilen bir öğenin içinde seçilen bir öğenin içinde seçilmiş bir öğeye sahip olmak gerçekten mantıklı mı?

"İç" ListBoxes'u basit ItemsControls olarak değiştirmenizi öneririm böylece iç içe geçmiş listeler seçili öğelere sahip olamaz. Bu çok daha basit bir kullanıcı deneyimi sağlar. Kaydırma çubuklarını çıkarmak için iç ItemsControls'u da aynı şekilde kullanmayı düşünebilirsiniz, ancak en azından kullanıcı hangi öğenin "seçildiği" konusunda kafa karıştırmayacaktır.

+0

_Does gerçekten Seçili öğenin içinde duyu Seçilen bir öğenin içinde bir seçilmiş öğe yapmak _ Evet. Bir listenin içindeki listeden bir listeyi başka nasıl seçersiniz? – wotanii

+0

bu, liste kutusundan başka birçok şeyi de kaldırır, örn. drop-events – wotanii

0

Böyle eski bir yazıyı uyandırdığım için üzgünüm. Aslında ScrollViewer'ın ekli özelliğini kullanarak ScrollViewer'ı devre dışı bırakabilirsiniz.

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

Bu hala – wotanii

+0

wheeling olayını çalmak için görünüyor. Benim için işe yaramıyor :( – Sam

+0

Benim için de işe yaramıyor. – Eftekhari

-1

Bunu kullanabilirsiniz! Tekerlek çalınmamış.

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

Sen XAML kaydırma olayı yakalayarak kaydırma etkinliklerinin çalmak devre dışı bırakabilirsiniz:

<ListBox PreviewMouseWheel="ScrollViewer_PreviewMouseWheel"> 

ve arkasında Kanunu içinde yeniden yayınlama:

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); 
     } 
    } 

çözüm tam liste kutusu içindir, ListView ile bana yardımcı oldu.

burada bu çözüm buldu:?

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

İlgili konular