2009-11-15 25 views
7

मेरे पास एक सूची बॉक्स है। इसमें आंतरिक स्क्रॉल व्यूअर है, इसलिए मैं माउस व्हील के साथ ListBox सामग्री को स्क्रॉल कर सकता हूं। यह ठीक काम करता है जब तक कि मैं आइटम टेम्पलेट सेट नहीं करता जिसमें एक और सूची बॉक्स होता है (वास्तव में, मेरे पास 4 नेस्टेड लिस्टबॉक्स =) हैं)। समस्या यह है कि आंतरिक Listbox के स्क्रॉलव्यूयर व्हीलिंग घटना चुराता है। क्या इस व्यवहार को रोकने के लिए कोई आसान तरीका है?ListBox में ScrollViewer को कैसे अक्षम करें?


मैं इस तरह ItemContainerStyle साथ ListBox था:

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

कैसे मैं इस तरह के संसाधनों में ItemContainer के मद सीमा के लिए शैली सेट कर सकते हैं? जैसा कि मुझे पता है ContentPresenter आइटम नियंत्रण का आइटम कंटेनर है। लेकिन इसमें सीमा नहीं है, इसलिए मैं इसे स्टाइल नहीं कर सकता।

उत्तर

40

आप बहुत सरल कुछ करने के लिए अपने नियंत्रण टेम्पलेट बदलकर एक ListBox से ScrollViewer निकाल सकते हैं:

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

हालांकि, मैं घोंसले listboxes के मूल्य सवाल उठाते हैं। याद रखें कि प्रत्येक ListBox एक चयनकर्ता है और इसमें एक अवधारणा है कि कौन सा आइटम "चयनित" है। क्या यह वास्तव में चयनित आइटम के अंदर किसी चयनित आइटम के अंदर एक चयनित आइटम रखने का एहसास है?

मैं सरल "ListBoxes को सरल ItemsControls में बदलने का सुझाव दूंगा ताकि नेस्टेड सूचियों में चयनित आइटम नहीं हो सकते हैं। यह एक बहुत ही सरल उपयोगकर्ता अनुभव के लिए बना देगा। स्क्रॉलबार को हटाने के लिए आपको अभी भी आंतरिक ItemsControls को फिर से दिखाना होगा, लेकिन कम से कम उपयोगकर्ता इस बात को भ्रमित नहीं करेगा कि किस आइटम को "चुना गया" है।

+0

_Does यह वास्तव में, बनाने भावना एक चयनित आइटम के अंदर एक चयनित आइटम के लिए एक चयनित आइटम के अंदर _ हां। किसी सूची के अंदर किसी सूची के अंदर सूची में से कोई आइटम कैसे चुनेंगे? – wotanii

+0

यह भी सूची बॉक्स से कई अन्य सामान को हटा देता है, उदा। ड्रॉप-इवेंट – wotanii

0

ऐसी पुरानी पोस्ट को जागने के लिए खेद है। असल में, आप 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); 
     } 
    } 

समाधान बिल्कुल ListBox के लिए है, यह ListView के साथ मेरी मदद की।

मैं यहाँ इस समाधान पाया:

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

संबंधित मुद्दे