2008-11-16 2 views
6

के लिए सिंक्रनाइज़ करना स्क्रॉल पदों मैं सिंक्रनाइज़ क्षैतिज स्क्रॉल स्थिति 2 WPF डेटा ग्रिड नियंत्रण के कोशिश कर रहा हूँ।2 WPF datagrids

<toolkit:DataGrid x:Name="SourceGrid" ScrollViewer.ScrollChanged="SourceGrid_ScrollChanged"> 

मैं एक दूसरे डेटा ग्रिड है:

<toolkit:DataGrid x:Name="TargetGrid"> 

ईवेंट हैंडलर में मैं IScrollInfo.SetHorizontalOffset उपयोग करने के लिए प्रयास कर रहा था

मैं की सदस्यता हूँ पहले डेटा ग्रिड के घटना ScrollChanged, लेकिन हां, डेटाग्रिड IScrollInfo का खुलासा नहीं करता है:

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

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

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

उत्तर

3

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

+0

हाँ। मैंने अतीत में वही काम किया है, हालांकि। ऐसा लगता है कि हमें इस तरह के दृश्य पेड़ के माध्यम से हैक करना नहीं चाहिए। बस एक और तरीका है कि डब्ल्यूपीएफ किनारों के चारों ओर मोटा है। – PeterAllenWebb

+2

सावधान रहें जब उपयोगकर्ता दृश्य विषयों को बदलता है - नियंत्रण तब नए टेम्पलेट्स (= नए दृश्य पेड़) प्राप्त करें, और आप गलत स्क्रॉलव्यूअर के संदर्भ में होंगे। आपको OnApplyTemplate में प्रतिक्रिया देनी चाहिए, और जब भी इसे बुलाया जाता है तो वास्तविक स्क्रॉलव्यूअर को देखें। Http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.onapplytemplate.aspx देखें –

1

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

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

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

+0

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

0

यह एक बढ़िया उपाय है। डब्ल्यूपीएफ में मेरे लिए ठीक काम किया।

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

मैं सिर्फ ScrollSynchronizer dll का भी उल्लेख किया, एक एक्सएमएल आयात कहा:

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

तो बस दोनों मेरे datagrids पर जोड़ा

<DataGrid.Resources> 
    <Style TargetType="ScrollViewer"> 
    <Setter Property="scroll:ScrollSynchronizer.ScrollGroup" Value="Group1" /> 
    </Style> 
</DataGrid.Resources> 
1

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

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 पर डाल एक संलग्न ईवेंट हैंडलर परिभाषा: कोड नीचे उदाहरण के लिए innerGrid.xaml.cs पर है

<Views:innerGridView Grid.Row="1" Margin="2,0,2,2" DataContext="{Binding someCollection}" 
             x:Name="grid1Control" 
             ScrollViewer.ScrollChanged="Grid1Attached_ScrollChanged" 
             ></Views:innerGridView> 

<Views:innerGridView Grid.Row="3" Margin="2,0,2,2" DataContext="{Binding someCollection}" 
             x:Name="grid2Control" 
             ScrollViewer.ScrollChanged="Grid2Attached_ScrollChanged" 
             ></Views:innerGridView> 

तो का उपयोग है कि सार्वजनिक ScrollViewer.SetHorizontalOffset (e.HorizontalOffset) विधि जब एक और स्क्रॉलिंग घटना होती है। कोड नीचे हैंडलर परिभाषा (

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

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