2008-11-04 11 views
6

मैं सी # से सिल्वरलाइट लिस्टबॉक्स की स्क्रॉल स्थिति को गतिशील रूप से बदलना चाहता हूं, और मुझे यह जानने की ज़रूरत है कि सी # से लिस्टबॉक्स नियंत्रण के स्क्रॉलव्यूयर तत्व को कैसे पहुंचाया जाए?सिल्वरलाइट/सी # में लिस्टबॉक्स नियंत्रण के स्क्रॉलव्यूयर तत्व को आप कैसे एक्सेस करते हैं?

धन्यवाद दोस्तों, जेफ

उत्तर

3

अच्छा प्रश्न है। मुझे इसे सीधे करने का कोई तरीका नहीं मिला, लेकिन सिल्वरलाइट कंट्रोल प्रोजेक्ट को देखकर काफी करीब आया (वे कुछ कक्षाओं में आइटम नियंत्रण पर स्क्रॉलव्यूअर का उपयोग करते हैं)। यहाँ कैसे आप इसे प्राप्त कर सकते हैं, लेकिन यह एक कस्टम लिस्टबॉक्स की आवश्यकता है:

public class TestBox : ListBox 
{ 
    private ScrollViewer _scrollHost; 

    protected override void PrepareContainerForItemOverride(DependencyObject element, object item) 
    { 
     var itemsHost = VisualTreeHelper.GetParent(element) as Panel; 

     for (DependencyObject obj = itemsHost; obj != item && obj != null; obj = VisualTreeHelper.GetParent(obj)) 
     { 
      ScrollViewer viewer = obj as ScrollViewer; 
      if (viewer != null) 
      { 
       _scrollHost = viewer; 
       break; 
      } 
     } 

     base.PrepareContainerForItemOverride(element, item); 
    } 
} 

वहाँ, उस घटना में हुक करने का एक और तरीका है (या एक और तरीका है कि पैनल प्राप्त करने के लिए) हो सकता है आप के लिए टेम्पलेट को देखें, तो लिस्टबॉक्स आपको स्क्रॉल व्यूअर को वास्तव में "स्क्रॉलव्यूयर" नाम दिया जाएगा, हालांकि GetTemplateChild विधि सुरक्षित है, इसलिए आपको अभी भी एक कस्टम क्लास बनाने की आवश्यकता होगी।

5

एक वर्ग है कि ListBox वर्ग से विरासत अंदर से, आप संरक्षित GetTemplateChild() का उपयोग कर सकते हैं:

var myScrollviewer = myListBox.GetTemplateChild("ScrollViewer") as ScrollViewer;

आप ListBox बाहर से इस का उपयोग करने की है, तो एक के माध्यम से ScrollViewer उजागर चाहते हैं संपत्ति फिर से विरासत के माध्यम से काम करना चाहिए।

कैवेट: यदि आपने अपना स्वयं का कस्टम टेम्पलेट सेट किया है, तो यह स्क्रॉलव्यूवर मौजूद नहीं हो सकता है। आप ऊपर दिए गए तरीके में "स्क्रॉलव्यूअर" के बजाय टेम्पलेट्स स्क्रॉलव्यूअर नाम का उपयोग कर सकते हैं।

+0

GetTemplateChild एक संरक्षित तरीका हो को दर्शाता है। क्या वह नया है? क्योंकि अब ऐसा लगता है कि आपका समाधान अब काम नहीं करेगा। http://msdn.microsoft.com/en-us/library/system.windows.controls.control.gettemplatechild(v=VS.95).aspx –

+0

निश्चित नहीं है, लेकिन मुझे लगता है कि आपको एक संपत्ति बनाना होगा विरासत वर्ग। अगर मैं सही ढंग से याद करता हूं तो अंत में मैंने यही किया; यह वैसे भी एक कस्टम सूचीदृश्य था। – Dann

+0

यह वास्तव में काम नहीं करता है और इसका प्रयास नहीं किया जाना चाहिए। GetTemplateChild एक संरक्षित विधि है। – Kevin

-1
ScrollViewer scrollViewer = yourListBox.getScrollHost(); 

अशक्त है कोई datasourse लिस्टबॉक्स को निर्धारित करते हैं, मेरे मामले में इसे वापस ठीक से यूआई तत्व केवल नीचे के बाद कोड निष्पादित

myListBox.ItemsSource = list; 
0

आप कॉल कर सकते हैं:

myListBox.ApplyTemplate(); 

मजबूर करने के लिए Listbox दृश्य पेड़ बनाया जाना चाहिए, अन्यथा GetTemplateChild() अगर आप इसे तुरंत एक्सेस करने का प्रयास करते हैं तो शून्य वापस आ जाएगा।

यह अच्छी तरह से काम करता है "Erno de Weerd" स्पष्टीकरण: GetTemplateChild() विधि को कॉल करने में सक्षम होने के लिए ListBox का उत्तराधिकारी है।

मैं भी करने की कोशिश की:

  • ListBox विस्तार विधि का उपयोग करने के लिए "GetScrollHost()" लेकिन यह कभी मुझे (के बाद भी पूरे पृष्ठ initialisations) के लिए काम किया।
  • "FindName()", लेकिन यह काम नहीं किया, भले ही मैंने ListBox टेम्पलेट में ScrollViewer नाम निर्दिष्ट किया।

एम्मानुएल (Silverlight 3)

1

के इसे आसान बनाने के ... अपने लिस्टबॉक्स टेम्पलेट में करते हैं, तो आप ScrollViewer नियंत्रण मिल सकती है। इसके लिए एक लोड विधि जोड़ें, और आप स्वयं प्रेषक तर्क से मिल जाएंगे।

private void ScrollViewer_Loaded(object sender, System.Windows.RoutedEventArgs e) 
    { 
     myScrollViewer = (sender as ScrollViewer); 
    } 

यह मेरे लिए काम करता है