2 WPF DataGrids के लिए स्क्रॉल स्थिति सिंक्रनाइज़ करना

मैं wpf DataGrid नियंत्रणों की क्षैतिज स्क्रॉल स्थिति सिंक्रनाइज़ करने की कोशिश कर रहा हूं।

मैं पहली डेटाग्रिड की स्क्रॉल चेंज ईवेंट की सदस्यता ले रहा हूं:


मेरे पास दूसरा डाटाग्रिड है:


ईवेंट हैंडलर में मैं IScrollInfo.SetHorizontalOffset का उपयोग करने का प्रयास कर रहा था, लेकिन हां, डेटाग्रिड IScrollInfo का खुलासा नहीं करता है:

private void SourceGrid_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    ((IScrollInfo)TargetGrid).SetHorizontalOffset(e.HorizontalOffset);
   //cast to IScrollInfo fails
}

क्या इसे पूरा करने का कोई और तरीका है? या क्या लक्ष्यग्रिड पर एक और तत्व है जो स्क्रॉल पोजीशन के सिंक्रनाइज़ेशन को प्राप्त करने के लिए आवश्यक IScrollInfo का खुलासा करता है?

बीटीडब्लू, मैं जमे हुए कॉलम का उपयोग कर रहा हूं , इसलिए मैं स्क्रॉलव्यूर्स के साथ डेटाग्रिड नियंत्रण दोनों को लपेट नहीं सकता।

0

5 उत्तर

ऐसा करने के लिए कोड का एक बड़ा टुकड़ा है:

http://www.codeproject.com/KB/WPF/ScrollSynchronization.aspx

0
जोड़ा

इंफ्राजिस्टिक्स ग्रिड का उपयोग करते समय हमें भी यही समस्या थी क्योंकि यह नहीं किया (अभी भी नहीं) जमे हुए कॉलम का समर्थन करता है। तो हमारे पास दो ग्रिड साइड-साइड थे जो एक के रूप में देखने के लिए बनाए गए थे। बाईं तरफ ग्रिड क्षैतिज स्क्रॉल नहीं किया गया था लेकिन दाईं तरफ ग्रिड था। गरीब आदमी के जमे हुए कॉलम।

वैसे भी, हम केवल दृश्य पेड़ तक पहुंचने और स्क्रॉलव्यूअर को खींचकर समाप्त हो गए। आखिरकार, हम जानते थे कि यह वहां था - यह ऑब्जेक्ट मॉडल द्वारा खुलासा नहीं किया गया था। यदि डब्ल्यूपीएफ ग्रिड ScrollViewer का पर्दाफाश नहीं करता है तो आप एक समान दृष्टिकोण का उपयोग कर सकते हैं। या आप ग्रिड को उपclass कर सकते हैं और इस काम को करने के लिए आवश्यक कार्यक्षमता जोड़ सकते हैं।

सुनने में रूचि है कि आपको ऐसा करने की आवश्यकता क्यों है।

0
जोड़ा
मेरे पास कोडप्लेक्स से डब्ल्यूपीएफ टूलकिट डेटाग्रिड का स्रोत है, इसलिए मैं इसे ढूंढ सकता हूं और इसे बेनकाब कर सकता हूं (मेरी पसंदीदा विधि नहीं)। मैं जमे हुए फलक प्रभाव (अला एक्सेल) प्राप्त करने के लिए 2 ग्रिड ढेर कर रहा हूं।
जोड़ा लेखक Philipp Schmid, स्रोत

माइक्रोसॉफ्ट उत्पाद समूह के मुताबिक, स्क्रॉलव्यूअर को खोजने के लिए दृश्य पेड़ को घुमाने के लिए अनुशंसित विधि है, क्योंकि उनके बारे में बताया गया है कोडप्लेक्स पर जवाब

0
जोड़ा
सावधान रहें जब उपयोगकर्ता दृश्य विषयों को बदलता है - नियंत्रण तब नए टेम्पलेट्स (= नए दृश्य पेड़) प्राप्त करें, और आप गलत स्क्रॉलव्यूअर के संदर्भ में होंगे। आपको OnApplyTemplate में प्रतिक्रिया देनी चाहिए, और जब भी इसे बुलाया जाता है तो वास्तविक स्क्रॉलव्यूअर को देखें। msdn.microsoft.com/en-us/library देखें/& hellip;
जोड़ा लेखक Tomáš Kafka, स्रोत
हाँ। मैंने अतीत में वही काम किया है, हालांकि। ऐसा लगता है कि हमें इस तरह के दृश्य पेड़ के माध्यम से हैक करना नहीं चाहिए। बस एक और तरीका है कि डब्ल्यूपीएफ किनारों के चारों ओर मोटा है।
जोड़ा लेखक PeterAllenWebb, स्रोत

यह एक अच्छा समाधान है। डब्ल्यूपीएफ में मेरे लिए ठीक काम किया।

http://www.codeproject.com/Articles/39244/Scroll-Synchronization

मैंने अभी स्क्रॉल सिंक्रनाइज़र डीएलएल का संदर्भ दिया है, एक एक्सएमएल आयात जोड़ा है:

xmlns: स्क्रॉल = "clr-नाम स्थान: ScrollSynchronizer"

तो बस इसे मेरे डेटाग्रिड्स और बॉब्स दोनों को अपने चाचा को जोड़ा:


   

0
जोड़ा

आप डेटाग्रिड को प्रत्येक स्क्रिड व्यूअर को प्रत्येक ग्रिड के लिए सार्वजनिक संपत्ति के रूप में बेनकाब करने के लिए ट्रिक कर सकते हैं, उदाहरण के लिए उपयोगकर्ता GridControl_ScrollChanged() हैंडलर उपयोगकर्ता नियंत्रण के आरंभ के दौरान बुलाया जाता है। इसे बेनकाब करने के लिए आप अपने ग्रिड को xaml व्यू फ़ाइल में बना सकते हैं, और फिर उनमें से दो को एक और xaml व्यू में लिखें। कोड के नीचे आंतरिक grid.xaml.cs पर है उदाहरण के लिए:

    public ScrollViewer Scroller { get; set; }//exposed ScrollViewer from the grid
    private bool _isFirstTimeLoaded = true; 

    private void innerGridControl_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        if (_isFirstTimeLoaded)//just to save the code from casting and assignment after 1st time loaded
        {
            var scroller = (e.OriginalSource) as ScrollViewer;
            Scroller = scroller;
            _isFirstTimeLoaded = false;
        }
    }

OuterGridView.xaml पर एक संलग्न ईवेंट हैंडलर परिभाषा डालें:




फिर उस स्क्रॉल व्यूअर .etHorizontalOffset (e.HorizontalOffset) विधि तक पहुंचें जब एक और स्क्रॉलिंग घटना होती है। नीचे कोड हैंडलर परिभाषा में से एक पर OuterGridView.xaml.cs में है (

private void Grid1Attached_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        if (e != null && !e.Handled)
        {
            if (e.HorizontalChange != 0.0)
            {
                grid2Control.Scroller.ScrollToHorizontalOffset(e.HorizontalOffset);
            }
            e.Handled = true;
        }
    }
private void Grid2Attached_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {
        if (e != null && !e.Handled)
        {
            if (e.HorizontalChange != 0.0)
            {
                grid1Control.Scroller.ScrollToHorizontalOffset(e.HorizontalOffset);
            }
            e.Handled = true;
        }
    }

यह भी सुनिश्चित करें कि आंतरिक ग्रिड (यदि कोई है, के अंदर कोई अन्य स्क्रॉल_changed ईवेंट है, उदाहरण के लिए यदि आप कॉलम डेटा टेम्पलेट में से किसी एक में डिफ़ॉल्ट स्क्रॉलर के साथ टेक्स्टबॉक्स को परिभाषित करते हैं) तो इसके ग्रिड के हैंडलर प्रोसेसिंग को रोकने के लिए यह ई। हैंडल सेट सही है (यह रूटीवेटेंट के डिफ़ॉल्ट बुलबुले व्यवहार के कारण हुआ)। वैकल्पिक रूप से आप स्क्रॉल ईवेंट को फ़िल्टर करने के लिए e.OriginalSource या e.Source पर जांच कर अतिरिक्त डाल सकते हैं, जिसे आप संसाधित करना चाहते हैं।

0
जोड़ा