2012-08-15 9 views
10

मेरे पास VirtualizingStackPanel के साथ एक अजीब व्यवहार है। मेरे पास ऐसी वस्तुओं के साथ एक सूची है जिसमें TextBlockTextWrap="Wrap" हैं। यहाँ कोड है:वर्चुअलाइजिंगस्टैक पैनेल और टेक्स्ट रैपिंग बग? विंडोज फोन

<ListBox x:Name="messagesList" ItemsSource="{Binding Messages}" > 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <toolkit:ContextMenuService.ContextMenu> 
        <toolkit:ContextMenu> 
        ... 
        </toolkit:ContextMenu> 
       </toolkit:ContextMenuService.ContextMenu> 
       <CheckBox Style="{Binding Own, Converter={StaticResource MsgTypeToStyle}}" 
          Tag="{Binding TimeString}" 
          IsEnabled="True"> 
        <TextBlock Text="{Binding Content}" TextWrapping="Wrap"/> 
       </CheckBox> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

यह बहुत अच्छा काम करता है, लेकिन अगर मैं बहुत तेजी से स्क्रॉल करने के लिए कोशिश (एमुलेटर पर माउस का उपयोग कर, नहीं prommatically) वहाँ कुछ पुस्तक में चल रहा है, शायद HorizontallOffset कभी कभी गलत गणना करता है, और में बहुत अजीब परिणाम के साथ अंत में नीचे (छवि देखें, सही छवि सामान्य व्यवहार demostrates)।

scroll bug

अनुसंधान के बाद मैं संयोजन VirtualizingStackPanel और TextBlock.TextWrap="Wrap" में है कि समस्या पता लगा, अगर मैं इस जोड़े को सब ठीक से काम करता से एक तत्व को हटा दें।

लेकिन मुझे बड़ी टेक्स्ट गणना के कारण वर्चुअलाइजेशन की आवश्यकता है, और TextWrap सही टेक्स्ट प्रदर्शित करने के लिए।

तो मैं वर्चुअलाइजिंग पैनल का अपना कार्यान्वयन करने के बारे में सोचता हूं, क्या आप कृपया मुझे मार्गदर्शन कर सकते हैं, यह कैसे करें, या वर्तमान समस्या को कैसे ठीक किया जाए?

युपीडी: समस्या: (!) पहले दो छवियों ListBox पहले से ही है पर
नीचे करने के लिए स्क्रॉल (यह किसी भी अधिक नीचे स्क्रॉल नहीं किया जा सकता है), लेकिन तत्वों गलत तरीके से रखा, सही रखने दाईं ओर दिखाई देता छवि। यह तभी होता है जब आप बहुत तेजी से स्क्रॉल करेंगे।

यूपीडी 2: मिलान अग्रवाल के लिए धन्यवाद। उन्होंने मेरी समस्या here का एक अच्छा मामला प्रदान किया। लगता है कि वास्तव में ListBox में एक बग है। प्रदान किया गया वर्कअराउंड मेरे परिदृश्य में फिट नहीं है, क्योंकि मुझे ListBox आइटम के अंदर नियंत्रण के साथ बातचीत करने की आवश्यकता है। अब मैं ManipulationCompleted घटना को पकड़ने और देखें कि क्या यह Inertial है, इसलिए कि पुस्तक का मतलब है करने के लिए कोशिश कर रहा हूँ और मैं पृष्ठ पर ध्यान केंद्रित करने के लिए सेट:

void messagesList_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) 
    { 
     if (e.IsInertial) 
      this.Focus(); 
    } 

पी.एस. शुभकामनाएं शुभकामनाओं के लिए धन्यवाद;)

+4

OFF_TOPIC: वीके प्रतियोगिता में गुड लक =) –

उत्तर

1

दूसरी स्क्रीन पर समस्या क्या है? आपका मतलब अंतिम संदेश के बाद बड़ी खाली जगह है? अंतिम संदेश पृष्ठ के नीचे नहीं रखा जा रहा है? क्या मुझे यह सही समझ रहा है?

असल में मैं अपने कोड और बग पुन: पेश करने की कोशिश नहीं की, लेकिन मेरी बात यह है कि आप अपने एप्लिकेशन में 3 पार्टी libs (Silverlight टूलकिट) का उपयोग कर रहे हैं, Coding4Fun Tools उपयोग करने के लिए क्यों नहीं रूप में अच्छी तरह के बाद से?

मैं इस डमी वर्ग ने लिखा है:

public class Message 
{ 
    public string Time { get; private set; } 
    public string Content { get; private set; } 

    public Message(string time, string content) 
    { 
     Time = time; 
     Content = content; 
    } 
} 

तो मैं मुख्य पेज निर्माता में इस डमी कोड डाल:

var _messages = new ObservableCollection<Message>(); 

for (int i = 0; i < 50; i++) 
{ 
    _messages.Add(new Message("12:40", "Teh very long string which should be wrapped. Pavel Durov gives WP7 Contest winners less money than he did for Android/iOS winners. FFFUUUUUUUUUUUUUU ")); 
} 

this.ListBox.ItemsSource = _messages; 

और XAML में मैं टूलकिट का चैट बबल नियंत्रण के साथ एक लिस्टबॉक्स डाल:

<ListBox x:Name="ListBox"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <c4fToolkit:ChatBubble> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="Auto"/> 
        </Grid.RowDefinitions> 
        <TextBlock Grid.Row="0" 
           Text="{Binding Content}" 
           TextWrapping="Wrap"/> 
        <TextBlock Grid.Row="1" 
           Text="{Binding Time}" 
           HorizontalAlignment="Right"/> 
       </Grid> 
      </c4fToolkit:ChatBubble> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

मैंने इसे चलाया और कोई अजीब व्यवहार नहीं देखा, शायद थोड़ा सा झुकाव।

dat pic is huge

आशा कुछ मदद मैंने किया: परिणाम नहीं है। प्रतियोगिता के साथ


मज़ा, मैं ही भाग लेंगे, लेकिन यह नहीं मानते कि 1.5 महीने के लिए एक सभ्य ग्राहक बनाने के लिए सक्षम हो जाएगा।

+0

धन्यवाद, मैं इस बाहर की जाँच करेंगे।अच्छा नमूना पाठ :) – Alexander

+0

नहीं, इस नियंत्रण में भी यह समस्या है, बस अलग-अलग ऊंचाई वाले आइटम बनाएं और उनके अंदर रखें बटन, उदाहरण के लिए, किसी भी बटन पर क्लिक करें और स्क्रॉल करें, यह बग – Alexander

+0

को पुन: उत्पन्न करेगा मुझे अभी याद आया है कि मुझे सामना करना पड़ा मेरी आखिरी परियोजना पर यह समस्या और मुझे कोई संदेह नहीं है कि यह मेरे वर्तमान में मौजूद है। लेकिन इस बग पर दिखाई देने वाली स्थितियां (तेज़ स्क्रॉलिंग) मेरे लिए सामान्य नहीं हैं इसलिए मैंने इसे ठीक करने की कोशिश नहीं की। =) – Oleg

9

Inorder स्क्रॉल आप अपनी पुस्तक नियंत्रण virtualize करने की जरूरत पर काले घटना पर काबू पाने के। उसके लिए आपको IList वारिस और ObservableCollection जिसमें आप डिफ़ॉल्ट इंडेक्सर अपने कैशिंग आवश्यकता पर निर्भर करता है और साथ ही साथ ओवरराइड अपने आइटम के लिए एक कैश बनाए रखने के लिए करना होगा करने के लिए अपने स्वयं के समान की एक Collection बनाना चाहिए। http://blogs.msdn.com/b/ptorr/archive/2010/08/16/virtualizing-data-in-windows-phone-7-silverlight-applications.aspx

उस पृष्ठ पर एक नमूना परियोजना नहीं है: मैं इस हो सकता है आप के लिए क्या देख रहे हैं। कि बाहर की कोशिश करो।

मैं भी लगता है कि आप इस समस्या का सामना कर रहे http://blog.rsuter.com/?p=258। मैं इस वर्चुअलाइजेशन खुद का उपयोग कर हल किया जा जाएगा लगता है। आशा है कि यह

+0

धन्यवाद, आप सही दिशा में मुझे जवाब देते हैं – Alexander

1

दूसरी छवि में क्या समस्या है में मदद करता है? ऐसा लगता है कि BlackArea बिल्कुल दिखाया है, या यह कि scrollview "bounceback" नहीं था के बाद स्क्रॉल सामग्री के साथ काला क्षेत्र को भरने के लिए खत्म हो गया है?

यह इस पता करने के लिए महत्वपूर्ण है, क्योंकि ... इस आशय बस WPF/WP7 .. BTW स्वाभाविक है। स्क्रोलर से अधिक स्क्रॉलिंग के बाद "bounceback", लेकिन ऐसा लगता है कि यह एक बग है और कभी कभी यह करने के लिए भूल जाता है चाहिए।

मैं क्योंकि काला/सफेद क्षेत्रों WP7 पर न केवल अक्सर हैं पूछ रहा हूँ, लेकिन और कहीं भी जहां जड़त्वीय स्क्रॉल के साथ एक XAMLish ScrollViewer है। तुम देखो, जब तेजी से मंच से स्क्रॉल बहुत स्क्रॉल दूर, धीरे धीरे भेजे आइटम अचानक पता चलता है कोई और आइटम देखते हैं कि "पर" नए आइटम प्रदान कर सकते हैं, तो आप सिर्फ पूर्व गणना की वस्तुओं के बाहर और आप एक बार स्क्रॉल, इसलिए - वापस खाली क्षेत्र ..

यह ज्यादातर होता है जब कुछ शर्तों पर एक बार होता है: आप तेजी से (yay) स्क्रॉल करें, अपने बाइंडिंग धीमी थे (अत्यधिक जटिल भाव) कर रहे हैं, अपने टेम्पलेट-प्रतिपादन धीमी गति से (जटिल गैर पुन: प्रयोज्य यूआई टेम्पलेट्स) है , बाइंडिंग पता नहीं है कि कितने आइटम वहाँ (IEnumerable नहीं IList करने के लिए बाध्य! -> कोई .Count जानकारी) कर रहे हैं, या रेंडरर does not एक आइटम के लिए आरक्षण कितना ऊंचाई पता (आइटम नहीं निरंतर ऊंचाई, लेकिन eveyr है आइटम अपने आप ही सटीक ऊंचाई निर्धारित करने के लिए) की गणना की जानी है।

आप इसे ठीक करना चाहते हैं, तो आपको पहले उन कारणों के साथ लड़ना है या आप अपने स्वयं स्क्रॉल लागू करने या ढेर पैनल virtualizing हैक करके स्क्रॉल जाने के लिए स्क्रोलर कुल ऊंचाई अनुमान के साथ bindingsource से वस्तुओं के खिला सिंक्रनाइज़ चाहिए बेहतर: उदाहरण के लिए, प्रदर्शन केवल एक बार में एक छोटा सा आइटम, स्क्रॉल घटनाओं को सुनने और जोड़ने/सूची के सिर/पूंछ से आइटम के अगले पैक को दूर गतिशील .. यह तेजी से स्क्रॉल करने के लिए अनुमति नहीं दे रहा द्वारा समस्या का समाधान होगा :)))))

मुझे विश्वास है कि आइटम ऊंचाई बाधित सबसे आसान तरीका है। आप कुछ वास्तव में निरंतर आकार आइटम बनाने के लिए स्मार्ट नहीं कर सकते?

+0

नहीं, आइटम अलग ऊंचाई होना चाहिए, उन्हें अपनी सभी सामग्री प्रदर्शित करनी होगी। मिलान अग्रवाल ने समस्या – Alexander

+0

के प्रदर्शन के साथ एक महान लिंक पोस्ट किया है, मैं समझता हूं कि मेरे पास एक ही समस्या के साथ कुछ ऐप्स हैं। वास्तव में, आपको उन कुछ चीजों पर ध्यान देना होगा जिन्हें मैंने इंगित किया है। तब कुछ संयोजन इस तरह के प्रभाव को मजबूर करते हैं। एक और बात, आप "जड़ता-स्क्रॉलिंग" को अक्षम करने की कोशिश कर सकते हैं और सामान्य, फ्लैट-स्क्रॉलिंग छोड़ सकते हैं, लेकिन आमतौर पर यह भी प्रतिकूल होता है क्योंकि इससे "महसूस" कम हो जाता है .. मैं आपके सटीक मामले को देखे बिना आगे आपकी मदद नहीं कर सकता। मैं केवल सामान्य कारणों को इंगित कर सकता हूं। यह समस्या आपके कोड, बाइंडिंग और प्रतिपादन के प्रदर्शन के बारे में है। – quetzalcoatl

1

मैं तुम्हें सरल संभव समारोह है कि लिपटे TextBlock और उस को बाँध के लिए एक ऊंचाई की गणना करता है बनाने के सुझाव देते हैं। इस तरह, आप लिस्टबॉक्स में चर ऊंचाई आइटम का लाभ मिलेगा, लेकिन virtualizing ढेर पैनल का उपयोग कर रखने के लिए मिलता है।

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