2009-06-17 12 views
16

क्या प्रोग्रामिंग रूप से एक WPF सूचीदृश्य स्क्रॉल करना संभव है? मुझे पता है कि Winforms यह नहीं करता है, है ना?मैं प्रोग्रामिंग रूप से एक WPF सूचीदृश्य कैसे स्क्रॉल कर सकता हूं?

मैं 50 इकाइयों को ऊपर या नीचे स्क्रॉल करने के बारे में बात कर रहा हूं, आदि। एक ही आइटम की ऊंचाई को एक साथ स्क्रॉल नहीं करना।

उत्तर

27

हां, आपको ListView से स्क्रॉलवियर को पकड़ना होगा, या एक बार जब आप उस तक पहुंच प्राप्त कर लेंगे, तो आप इसके द्वारा प्रकट किए गए तरीकों का उपयोग कर सकते हैं या स्क्रॉलिंग को ओवरराइड कर सकते हैं। आप मुख्य सामग्री क्षेत्र प्राप्त करके और IScrollInfo इंटरफ़ेस के कार्यान्वयन का उपयोग करके भी स्क्रॉल कर सकते हैं।

यहाँ एक ListBox, ListView की तरह कुछ की ScrollViwer घटक प्राप्त करने के लिए एक छोटे से सहायक, आदि

public static DependencyObject GetScrollViewer(DependencyObject o) 
{ 
    // Return the DependencyObject if it is a ScrollViewer 
    if (o is ScrollViewer) 
    { return o; } 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++) 
    { 
     var child = VisualTreeHelper.GetChild(o, i); 

     var result = GetScrollViewer(child); 
     if (result == null) 
     { 
      continue; 
     } 
     else 
     { 
      return result; 
     } 
    } 
    return null; 
} 

है और फिर आप बस का उपयोग कर सकते .LineUp() और .LineDown() इस तरह:

private void OnScrollUp(object sender, RoutedEventArgs e) 
{ 
    var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer; 

    if (scrollViwer != null) 
    { 
     // Logical Scrolling by Item 
     // scrollViwer.LineUp(); 
     // Physical Scrolling by Offset 
     scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3); 
    } 
} 

private void OnScrollDown(object sender, RoutedEventArgs e) 
{ 
    var scrollViwer = GetScrollViewer(uiListView) as ScrollViewer; 

    if (scrollViwer != null) 
    { 
     // Logical Scrolling by Item 
     // scrollViwer.LineDown(); 
     // Physical Scrolling by Offset 
     scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + 3); 
    } 
} 


<DockPanel> 
    <Button DockPanel.Dock="Top" 
      Content="Scroll Up" 
      Click="OnScrollUp" /> 
    <Button DockPanel.Dock="Bottom" 
      Content="Scroll Down" 
      Click="OnScrollDown" /> 
    <ListView x:Name="uiListView"> 
     <!-- Content --> 
    </ListView> 
</DockPanel> 

लाइनअप और लाइनडाउन द्वारा खुलासा गया लॉजिकल स्क्रॉलिंग अभी भी आइटम द्वारा स्क्रॉल करता है, यदि आप एक सेट राशि से स्क्रॉल करना चाहते हैं तो आपको ऊपर स्क्रॉलटॉरिज़िंटल/वर्टिकल ऑफसेट का उपयोग करना चाहिए। यदि आप कुछ और जटिल स्क्रॉलिंग भी चाहते हैं, तो मैंने इस other question में दिए गए उत्तर को देखें।

+2

वर्टिकल स्क्रॉल डाउन और अप दोनों के लिए, आप 'वर्टिकल ऑफसेट' में 3 जोड़ रहे हैं। क्या यह सही है? इसके लिए, हमें जोड़ने के बजाय, 3 घटाएं। – Syed

3

क्या आपने ScrollIntoView को आजमाया है? वैकल्पिक रूप से, यदि यह एक विशिष्ट आइटम नहीं है जिसे आपने देखा है, लेकिन वर्तमान स्थिति से ऑफसेट है, तो आप BringIntoView का उपयोग कर सकते हैं।

+0

धन्यवाद नहीं, उनको नहीं देखा है। –

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