2009-03-11 8 views
13

का उपयोग करते समय सिल्वरलाइट त्रुटि "लेआउट साइकिल का पता लगाया लेआउट पूरा नहीं हो सका" मैं सामग्री नियंत्रण से प्राप्त करके सिल्वरलाइट में कस्टम नियंत्रण बना रहा हूं और सामग्री के पीछे एक बूंद छाया डालने के लिए कुछ विशेष स्वरूपण कर रहा हूं।कस्टम नियंत्रण

मुझे लगभग यह काम मिल गया है लेकिन हाल ही में एक विचित्र त्रुटि में भाग गया है। यह ठीक काम करता है अगर इसमें सीमा के अलावा कुछ भी शामिल है, या एक ग्रिड/स्टैकपैन/आदि जिसमें स्पष्ट रूप से परिभाषित ऊंचाई और चौड़ाई नहीं है।

मैं IE में एक जावास्क्रिप्ट त्रुटि मिलती है, और पाठ का कहना है:

रनटाइम त्रुटि 4008 ... लेआउट चक्र का पता चला ... लेआउट पूरा नहीं हो सका।

यदि मैं निहित ग्रिड/स्टैकपैन/आदि पर ऊंचाई और चौड़ाई निर्दिष्ट करता हूं तो यह ठीक काम करता है।

इस त्रुटि के बारे में वेब पर एक टन है जब बहुत सारे टेक्स्टबॉक्स का उपयोग किया जाता है (250 से अधिक), लेकिन मैं ग्रिड में एक बटन के साथ अपनी त्रुटि को पुन: उत्पन्न करने में सक्षम हूं।

मेरे पास पृष्ठ पर कोई टेक्स्टबॉक्स नहीं है। त्रुटि को एक अनदेखा अनंत लूप के साथ करना है। मैंने कोड में कुछ ब्रेकपॉइंट्स सेट किए हैं और ऐसा लगता है कि "साइज चेंज" ईवेंट को प्रतिपादन के दौरान बहुत कुछ कहा जा रहा है, और प्रत्येक बार ऊंचाई/चौड़ाई 10 से बढ़ जाती है।

मुझे लगता है कि एक डिफ़ॉल्ट ऊंचाई/चौड़ाई यह संख्या के इस वृद्धि को छोड़ने का कारण बनती है, लेकिन मुझे नहीं पता कि यह त्रुटि क्यों हो रही है।

क्या कोई इस में भाग गया है या कोई विचार है?

+0

मैं Telerik RadWindow नियंत्रण के साथ इस मुद्दे आई है (यह शायद भी नियमित रूप से ChildWindow के साथ हो जाएगा)। समस्या तब हुई जब मैंने चौड़ाई और ऊंचाई निर्दिष्ट किए बिना मिनहेइट और मिनविड्थ निर्दिष्ट किया। जब विंडो की सामग्री का आकार बदल गया, तो एक लेआउट चक्र हुआ। Minwidth और MinHeight के रूप में समान मानों के लिए चौड़ाई और ऊंचाई सेट करना समस्या हल हो गई। –

उत्तर

7

good blog post on this error here है।

मूल रूप से क्या हो सकता है आप MeasureOverride में कुछ आकार बदल रहे हैं जो किसी अन्य उपाय का कारण बनता है, जो आकार को बदलता है, जो माप को मापता है और इसी तरह। मैं एक बार पहले इसमें भाग गया और लेआउट चक्र के दौरान लेआउट अपडेट के कारण लेआउट अपडेट को ट्रिगर करने वाले किसी भी कोड को हटाकर इसे ठीक कर दिया।

अद्यतन: के बाद से ब्लॉग पोस्ट चला गया है, इसे यहाँ पूर्ण में उद्धृत:

सिल्वरलाइट 2 के लिए gotchas के मेरी श्रृंखला को जारी रखते हुए, मैं एक सामान्य त्रुटि है कि लोगों को देख रहे हैं के बारे में बात करना चाहता था। यह त्रुटि कुछ नया है जिसे आप बीटा 2 से रिलीज उम्मीदवार या बाद में कोड लेते समय देख सकते हैं। बीटा 2 में, यदि लेआउट इंजन ने एक चक्र का पता लगाया, तो उसने कोई त्रुटि नहीं फेंक दी; जैसा कि मैंने इसे समझ लिया, लेआउट अभी छोड़ा गया था। लेकिन बीटा 2 बिट्स के साथ, एक त्रुटि फेंक दी जाती है।

आपको जो त्रुटि मिलेगी वह संदेश के रूप में "लेआउट साइकिल का पता लगाया जाएगा" निर्दिष्ट करेगा। यह त्रुटि संदेश बहुत सटीक है - लेआउट इंजन को आपके लेआउट के भीतर एक चक्र का पता चला; या इसे कहने का एक और तरीका, आपके लेआउट में एक अनंत लूप है।

सबसे बड़ी अपराधी जो इस त्रुटि की ओर ले जाती है वह लेआउट अपडेटेड इवेंट हैंडलर के भीतर कोड है। यदि आपका लेआउट अपडेटेड इवेंट हैंडलर आपके नियंत्रण के लेआउट को बदलने के लिए कुछ भी करता है, तो इससे लेआउट अपडेटेड इवेंट फिर से आग लग जाएगा, और फिर ... :-)

कभी-कभी आपको लेआउट को कोड बदलने की आवश्यकता होती है हालांकि इस घटना हैंडलर, तो क्या करना है?

सबसे पहले, आपको यह विचार करना चाहिए कि क्या आपको वास्तव में लेआउट अपडेटेड में प्रत्येक कॉल पर होने वाले लेआउट परिवर्तनों की आवश्यकता है या नहीं। लोड किए गए ईवेंट के साथ-साथ एप्लिकेशन को संभालने के लिए पर्याप्त होगा। Current.Host.Content.Resized घटना। इन दो घटनाओं के बीच, जब आप दृश्य वृक्ष में नियंत्रण लोड हो जाते हैं, तो आपको अधिसूचित किया जाएगा, और मेजबान का आकार बदलने पर आपको अधिसूचित किया जाएगा, जिससे आपको अपना लेआउट फिर से बदलना पड़ सकता है। मॉडेल संवाद जैसे परिदृश्य इस श्रेणी में आना चाहिए।

दूसरा, यदि आपको वास्तव में लेआउट अपडेटेड का उपयोग करने की आवश्यकता है, तो आपको बस अपने लेआउट परिवर्तनों के आसपास कुछ स्थितियां रखने की आवश्यकता हो सकती है। उदाहरण के लिए, यदि आप वास्तव में चौड़ाई और ऊंचाई निर्धारित करने से पहले, अपने नियंत्रण के लिए एक नई चौड़ाई और ऊंचाई की गणना कर रहे हैं, तो यह सुनिश्चित करने के लिए जांचें कि वर्तमान मान आपके द्वारा गणना की गई चीज़ों से अलग हैं। इससे पहले लेआउट अपडेटेड ईवेंट को आपके नियंत्रण का आकार बदलने की अनुमति मिलेगी, जो एक और लेआउट अपडेटेड ईवेंट को ट्रिगर करता है, लेकिन वह घटना पहचान लेगी कि ऐसा करने के लिए कोई काम नहीं है, और चक्र समाप्त हो जाएगा।

ये नियम लागू होंगे जब आप SizeChanged ईवेंट को प्रबंधित कर रहे हों, या यदि आप अपने नियंत्रण के लेआउट पर कोई अन्य ओवरराइड कर रहे हैं।

+0

यह समस्या है जो मैं देख रहा हूं। लिंक किए गए ब्लॉग पोस्ट में केवल आरंभिक लोड पर आपकी लेआउट सामग्री करने का सुझाव दिया जाता है और जब चांदी की रोशनी ऐप (युक्त उपयोगकर्ता नियंत्रण) इसके आकार को बदलता है।यह मेरे लिए काम कर सकता है, लेकिन एनिमेशन और अन्य कार्रवाइयां करते समय मैंने अभी तक इसका परीक्षण नहीं किया है। सहायता के लिए धन्यवाद! –

+0

@ ब्रायंट ब्लॉग मृत; ( – MemeDeveloper

+0

बचाव के लिए वेबैक मशीन: https://web.archive.org/web/20110203182929/http://jeffhandley.com/archive/2008/09/26/silverlight-2-post- beta2-पकड़ लिया --- लेआउट चक्र-detected.aspx – Bryant

6

एक आम कारण SizeChanged को संभालने वाला है और फिर हैंडलर में ऐसा कुछ करने से तत्व के आकार को प्रभावित करता है। कभी-कभी यह स्पष्ट नहीं होता है - यह बाल तत्वों को संशोधित कर सकता है जो उदाहरण के लिए उनके कंटेनर के आकार को प्रभावित करते हैं।

1

मैं एक ही समस्या थी और एन बाद में लागू क्या मैंने किया है एक "आह्वान" प्रतिनिधि के सारे लेआउट अद्यतन (आकार परिवर्तन) रखा गया था, यह दुर्घटनाग्रस्त बंद हो जाता है, लेकिन आप एक अच्छा बदलाव यह एक चक्र में फँस गया है वहाँ है

4

1. यदि आप स्क्रॉलव्यूअर के अंदर LongListSelector का उपयोग कर रहे हैं, तो इसे बेहतर तरीके से हटा दें। मुझे एक ही समस्या का सामना करना पड़ रहा था और मेरा LongListSelector ScrollViewer के अंदर था। ItemRealized घटना के दौरान, यह त्रुटि हो रही थी।

2.Don't) का उपयोग updatelayout (अंदर itemrealized..I

list.UpdateLayout(); 
list.ScrollTo(e.Container.Content); 

की तरह कुछ प्रयोग कर रहा था 3. यदि आप longlistselector अंदर छवि का उपयोग कर रहे हैं, बस ScrollTo

उपयोग करते हैं, तैयार करना न भूलें छवि की ऊंचाई और चौड़ाई।

0

मुझे एक ही समस्या थी, लेकिन यह केवल बहुत ही कम हुआ, मेरा कोड वर्षों से नहीं बदला है और हाल ही में किसी ने इसका अनुभव करने में कामयाब रहे हैं।

मैं एक LongListSelector डेटा स्रोत के अंदर एक TextBlock था और इसके FONTSIZE किसी अन्य मान मेरे लिए समस्या तय करने के लिए FONTSIZE बदलने ...

मेरे LongListSelectors एक ScrollViewer के अंदर है 21. करने के लिए स्थापित किया गया था।

  <phone:PanoramaItem x:Name="OwnedGamesPanoramaItem" > 
      <ScrollViewer Margin="5,-25,0,0"> 
      <StackPanel> 
        <TextBlock toolkit:TiltEffect.IsTiltEnabled="True" Text="{Binding Path=LocalizedResources.XOwnedGames, Source={StaticResource LocalizedStrings}}" FontFamily="Segoe WP Semibold" CharacterSpacing="10" FontSize="25" Margin="0,10,0,25" TextWrapping="Wrap"/> 
        <TextBlock x:Name="ownedGameLoadingTextBox" Margin="10" FontSize="26" Text="{Binding Path=LocalizedResources.XLoading, Source={StaticResource LocalizedStrings}}" HorizontalAlignment="Center"/> 
        <phone:LongListSelector x:Name="OwnedGameListBox" Tap="OwnedGameListBoxTap" ScrollViewer.VerticalScrollBarVisibility="Disabled" ItemRealized="OwnedGameListBox_ItemRealized" ItemUnrealized="OwnedGameListBox_ItemUnrealized" BorderThickness="0,20,0,0" > 
         <phone:LongListSelector.ItemTemplate> 
          <DataTemplate> 
           <StackPanel Orientation="Vertical" Tap="OwnedGameListBoxTap" Margin="0,0,0,12"> 
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10,0,0" Tap="StackPanel_Tap_1"> 
             <Image Width="60" Source="{Binding getSmallImageActualURL}" Height="60" Margin="3" VerticalAlignment="Top" /> 
             <StackPanel Margin="15,0,0,0"> 
              <TextBlock Width="320" TextWrapping="Wrap" Text="{Binding name}" Margin="0,0,0,0" FontSize="32" /> 
              <TextBlock Text="{Binding getTotalPlaytimeFormatted}" Margin="0,0,0,0" TextWrapping="Wrap" FontSize="21" > 
               <TextBlock.Foreground> 
                <SolidColorBrush Color="{StaticResource PhoneAccentColor}"/> 
               </TextBlock.Foreground> 
              </TextBlock> 
             </StackPanel> 
            </StackPanel> 
           </StackPanel> 
          </DataTemplate> 
         </phone:LongListSelector.ItemTemplate> 
        </phone:LongListSelector> 
       </StackPanel> 
      </ScrollViewer> 
     </phone:PanoramaItem> 

फिक्स:

<TextBlock Text="{Binding getTotalPlaytimeFormatted}" Margin="0,0,0,0" TextWrapping="Wrap" FontSize="22" >