2009-07-24 14 views
5

SeveralotherquestionsonSO मेरे पास एक ही निष्कर्ष पर आया है - एक ItemsControl का उपयोग DataTemplate के साथ प्रत्येक आइटम के लिए बनाए गए आइटमों के लिए किया गया है जैसे कि वे ग्रिड जैसा दिखते हैं, उपयोग करने से अधिक सरल (विशेष रूप से प्रारूपित) एक ListViewडब्ल्यूपीएफ - लेआउट के दौरान नृत्य/कूदने से आइटम्स कंट्रोल छद्म-ग्रिड के कॉलम को कैसे रोकें

कोड जैसा दिखता है:

<StackPanel Grid.IsSharedSizeScope="True"> 
    <!-- Header --> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto" SharedSizeGroup="Column1" /> 
     <ColumnDefinition Width="Auto" SharedSizeGroup="Column2" /> 
    </Grid.ColumnDefinitions> 
    <TextBlock Grid.Column="0" Text="Column Header 1" /> 
    <TextBlock Grid.Column="1" Text="Column Header 2" /> 
    </Grid> 
    <!-- Items --> 
    <ItemsControl ItemsSource="{Binding Path=Values, Mode=OneWay}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <Grid> 
      <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Column1" /> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Column2" /> 
      </Grid.ColumnDefinitions> 
      <TextBlock Grid.Column="0" Text="{Binding ColumnProperty1}" /> 
      <TextBlock Grid.Column="1" Text="{Binding ColumnProperty2}" /> 
     </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</StackPanel> 

समस्या जो मैं देख रहा हूं वह यह है कि जब भी मैं उस ऑब्जेक्ट को स्वैप करता हूं जिस पर ItemsSource बाध्य होता है (यह एक ObservableCollection है जिसे मैं स्पष्ट रूप से संदर्भित करने के बजाय संदर्भ को प्रतिस्थापित करता हूं -एड), पूरे 'ग्रिड' कुछ सेकंड के लिए नृत्य करता है।

संभवतः यह सभी Auto -width कॉलम को मिलान करने के लिए कुछ लेआउट पास कर रहा है।

यह मेरे उपयोगकर्ताओं के लिए बहुत विचलित है और मैं इसे हल करना चाहता हूं। क्या किसी और ने इसे देखा है?

+0

मुझे एक ही समस्या है। क्या आपको कभी इसका संकल्प मिला? –

+0

@ रिक: दुर्भाग्य से नहीं, मैंने कभी भी काम नहीं किया कि क्या हो रहा था। यह इतना परेशान हो गया कि मैंने निश्चित रूप से निश्चित चौड़ाई वाले स्तंभों का चयन किया, हालांकि निश्चित रूप से समस्याओं के एक अलग सेट के साथ आया था। यह मेरे मामले में कम बुराई था। –

+0

@ रिक, क्या आप WinForms के अंदर होस्टिंग कर रहे थे? इसके लिए एक रेपो केस प्राप्त करना अच्छा होगा। आप .NET का किस संस्करण का उपयोग कर रहे हैं? मैं 3.5 (प्री-एसपी 1) का उपयोग कर रहा था। –

उत्तर

0

दुर्भाग्य से मैं प्रदान किए गए कोड के साथ समस्या को पुन: उत्पन्न करने में सक्षम नहीं था। मैंने इसे 20 से 1000 वस्तुओं के नमूने स्वैप करने की कोशिश की है, और संग्रह के अंदर 100 अलग-अलग चौड़ाई के साथ। कुछ भी नाच रहा था। विशाल संग्रह (200 और उच्चतर) यूआई थोड़ी देर के लिए लटका हुआ था और फिर जारी किए गए सामानों के साथ नए ग्रिड को दिखाता था।

+0

@ आर्किमिड, यह कोशिश करने के लिए धन्यवाद। मैंने देखा है कि यह मेरे यूआई में कुछ अलग-अलग स्थानों में 5 पंक्तियों के साथ होता है, और बिना किसी शेर से बचने के लिए IsSharedSizeScope के बिना निश्चित चौड़ाई कॉलम के लिए जाना पड़ता है। मुझे आश्चर्य है कि यह WinForms ElementHosts के भीतर मेरे तत्वों को होस्ट करने से संबंधित है ... –

1

ऐसा लगता है कि इस समस्या को देखने से पहले ग्रिड की सामग्री जटिलता का एक निश्चित स्तर होना चाहिए।

ओपी में दिखाए गए सरल टेक्स्टब्लॉक शायद समस्या को आसानी से प्रकट नहीं करते हैं क्योंकि वे स्थिर आकार हैं। यदि आप किसी सेल में टेक्स्टबॉक्स (टेक्स्टब्लॉक नहीं) फेंकते हैं, तो रन-टाइम पर, टेक्स्टबॉक्स को सेल का विस्तार करने के लिए पर्याप्त टेक्स्ट दर्ज करें, आपको देखना चाहिए कि यह तुरंत जंगली ढंग से नृत्य करना शुरू कर देता है ... यह ठीक है बहुत अधिक स्वीकार्य लाइन। मेरे आइटम नियंत्रण में 7 पंक्तियां थीं।

यह प्रभावी ढंग से संपादन योग्य, टेक्स्टबॉक्स उन्मुख ग्रिड सामग्री के लिए पूर्ण रूप से प्रचारित IsSharedSizeScope + ItemControl दृष्टिकोण को बढ़ावा देता है।

मेरी जरूरतों के लिए, ListView या बल्कि "ItemsControl + GridViewRowPresenter" प्रस्तुत here और here के रूप में दृष्टिकोण एक बहुत ही सीधा विकल्प है और इन लेआउट मुद्दों में से किसी में नहीं है।

उन लोगों के लिए "डेटाग्रिड क्यों नहीं?": डेटाग्रिड संपादन के लिए एक निश्चित दृष्टिकोण लगाता है। मैं उन सभी के माध्यम से काम करने के लिए तैयार था, लेकिन डेटाग्रिड मैलिल्स प्रमाणीकरण के तरीके के साथ एक मृत अंत में घायल हो गया। समर्थन समर्थन। छोटे लाल प्रमाणीकरण त्रुटि बॉक्स सरल डेटाग्रिडटेक्स्ट कॉलम के लिए ठीक काम करेंगे, लेकिन डेटाग्रिड टेम्पलेट कॉलम के लिए (एक कॉलम में एक से अधिक टेक्स्टबॉक्स प्रदान करने के लिए आवश्यक), यह प्रारंभ में लाल बक्से दिखाएगा और फिर उनको असंगत रूप से छुपाएगा जहां आप आसपास क्लिक करने के लिए गए थे डेटा ग्रिड। बाद के सत्यापन पर ताज़ा करने पर वे पूरी तरह से अदृश्य हो जाएंगे। (पुराना उदाहरण: http://code.google.com/p/itraacv2-1/source/browse/trunk/scraps/tabSponsor%20-%20before%20deactive%20rewrite.xaml, "गूंध: मेरे लिए फ्रिगजिन जीवन" के लिए खोजें ...)

मेरा पूरा प्रोजेक्ट स्रोत ऑनलाइन है। यह GridViewRowPresenter दृष्टिकोण यहां दर्शाया गया है: http://code.google.com/p/itraacv2-1/source/browse/trunk/App/View/tabSponsor.xaml

1

अपने सभी ग्रिड कॉलम पर मिनविड्थ सेट करने का प्रयास करें।

मैंने भी इस अजीब अस्थिरता का अनुभव किया है। हालांकि, मुझे अपने सभी ग्रिड कॉलम पर एक सेट मिनविड्थ निर्दिष्ट करके इसे नियंत्रण में मिला। स्क्रीन को पहली बार प्रदर्शित होने पर यह चीजों को स्थिर करने लगता है। बेशक, क्योंकि आपके कॉलम अभी भी जुड़े हुए हैं, वे जो भी नियंत्रण जीतने की अधिकतम चौड़ाई तक बढ़ते हैं।

इसके अलावा, IsSharedSizeScope को बंद करें और अपनी ग्रिड को पहले लाइन करने के लिए प्रयास करें, फिर इसे वापस चालू करें।

+0

'MinWidth' प्रॉपर्टी को सेट करना मेरे लिए काम करता है। –

+0

क्या आप 'मिनीविड्थ' को बहुत छोटे से सेट कर सकते हैं, ताकि यह किसी भी चौड़ाई को अनावश्यक रूप से बर्बाद न करे? –

0

मुझे एक ही समस्या थी, मैंने मिनीविड्थ को उत्तर में से एक में सुझाव देने की कोशिश की, लेकिन यह मेरे लिए काम नहीं कर सका। मदद क्या थी, चौड़ाई को एक ग्रिड से दूसरी तरफ बाध्यकारी थी। मैं SharedSizeGroup साथ स्तंभों में से कुछ छोड़ दिया है, और कुछ भी नहीं कूदता है:

<Grid Grid.IsSharedSizeScope="True"> 
... 
    <Grid Grid.Row="1"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Group0"/> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Group1"/> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="Group2"/> 
      <ColumnDefinition Width="Auto" x:Name="Column3"/> 
      <ColumnDefinition Width="Auto" x:Name="Column4"/> 
      <ColumnDefinition Width="Auto" x:Name="Column5"/> 
     </Grid.ColumnDefinitions> 
    ... 
    </Grid> 

    <ItemsControl> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="Group0"/> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="Group1"/> 
         <ColumnDefinition Width="Auto" SharedSizeGroup="Group2"/> 
         <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=Column3}"/> 
         <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=Column4}"/> 
         <ColumnDefinition Width="{Binding Path=ActualWidth, ElementName=Column5}"/> 
        </Grid.ColumnDefinitions> 
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
... 
</Grid> 

मैं नहीं जानता कि कितने कॉलम आप SharedGroupSize साथ छोड़ सकते हैं और इसलिए आप के साथ चारों ओर खेल सकते हैं उनमें से कितने, बंधे होने के लिए की जरूरत है कॉलम देखने के लिए कि आपके लिए क्या काम करता है।

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