2011-07-19 15 views
6

यहां मेरी समस्या है।क्या WPF डेटा बाइंडिंग (प्रतिपादन में सुधार) में देरी करने का कोई तरीका है?

ListBox एक अवलोकन संग्रह में सभी आइटम दिखाएं।

ListBox बी केवल उन ListBox ए

<ListBox ItemsSource="{Binding MyView}" Name="ListBoxA"> 
    <ListBox ItemsSource="{Binding Path=SelectedItems, 
     ElementName=ListBoxA}" Name="ListBoxB"> 

जब चयन ListBox ए में परिवर्तित हो जाता है में चुने गए आइटम पता चलता है, एक स्टोरीबोर्ड चलाता है। परिणामी यूआई उपयोगकर्ता के चयन के आधार पर ListBox B में और बाहर एक शांत और चिकनी स्लाइड है।

समस्या यह है कि, जहां मेरी लिस्टबॉक्स एक डाटाबेस केवल नाम संपत्ति है, लिस्टबॉक्स बी डेटाबेस दर्जनों और कुछ मामलों में भी सैकड़ों गुण हैं।

समस्या तब भी जारी है जब डब्ल्यूपीएफ में डाटाबेसिंग एक छोटी, 50-500 मिलीसेकंद यूआई देरी बनाता है जब यह प्रतिपादन होता है (विशेष रूप से जब यह गतिशील होता है)। यूआई फ्रीज।

यह टिकाऊ है। लेकिन मेरी स्टोरीबोर्ड को इस डेटा बाइंडिंग विलंब से अवरुद्ध लगता है। नतीजतन यूआई प्रकार "स्नैप्स" जगह में और मेरी चिकनी स्टोरीबार्ड नहीं देखी गई है।

मैंने स्टोरीबोर्ड को संलग्न करके इसे हल किया है। पूर्ण घटना। एक बार स्टोरीबार्ड पूरा होने के बाद, मैंने सूची बॉक्स बी

के लिए आइटमसोर्स सेट किया है, हालांकि, यह केवल 50% अच्छा है। उपयोगकर्ता स्टोरीबोर्ड निष्पादित करता है, हां। लेकिन एनीमेशन के बाद सूचीबॉक्स बी के परिणामी यूआई अभी भी "स्नैप" देखे गए हैं।

ऐसा लगता है कि सही समाधान किसी भी तरह से सूची बॉक्स बी के अंदर दिए गए नियंत्रणों को इंगित करने या वास्तविक डेटाबेस में देरी करने का संकेत देता है। यह यूआई को स्टोरीबोर्ड में प्रस्तुत करने और भाग लेने की अनुमति देगा - लेकिन बाद में "भरने" के लिए डेटा (उम्मीद है कि डेटा बाइंडिंग के कारण देरी में भी देरी हो रही है)।

क्या किसी को भी ऐसी ही समस्या है?

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Page.Resources> 

    <x:Array Type="{x:Type sys:String}" x:Key="MyData"> 
     <sys:String>One</sys:String> 
     <sys:String>Two</sys:String> 
     <sys:String>Three</sys:String> 
     <sys:String>Four</sys:String> 
     <sys:String>Five</sys:String> 
     <sys:String>Six</sys:String> 
    </x:Array> 

    <Storyboard x:Key="MyGrowStoryboard"> 
     <ParallelTimeline> 
      <DoubleAnimation To="1" DecelerationRatio="0.5" 
     Duration="00:00:00.500" 
     Storyboard.TargetName="MyTransform" 
     Storyboard.TargetProperty="ScaleX" /> 
      <DoubleAnimation To="1" DecelerationRatio="0.5" 
     Duration="00:00:00.500" 
     Storyboard.TargetName="MyTransform" 
     Storyboard.TargetProperty="ScaleY" /> 
     </ParallelTimeline> 
    </Storyboard> 
    <Storyboard x:Key="MyShrinkStoryboard"> 
     <ParallelTimeline> 
      <DoubleAnimation To=".1" DecelerationRatio="0.5" 
     Duration="00:00:00.500" 
     Storyboard.TargetName="MyTransform" 
     Storyboard.TargetProperty="ScaleX" /> 
      <DoubleAnimation To=".1" DecelerationRatio="0.5" 
     Duration="00:00:00.500" 
     Storyboard.TargetName="MyTransform" 
     Storyboard.TargetProperty="ScaleY" /> 
     </ParallelTimeline> 
    </Storyboard> 

    </Page.Resources> 
    <StackPanel> 
    <ListBox ItemsSource="{Binding Source={StaticResource MyData}}" 
    Name="ListBoxA"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Vertical" /> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemTemplate> 
     <DataTemplate> 
      <DataTemplate.Triggers> 

       <!-- grow --> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Value="True" 
      Binding="{Binding Path=IsSelected, 
      RelativeSource={RelativeSource 
      Mode=FindAncestor, 
      AncestorType={x:Type ListBoxItem}}}" /> 
        </MultiDataTrigger.Conditions> 
        <MultiDataTrigger.EnterActions> 
         <BeginStoryboard 
      Storyboard="{StaticResource MyGrowStoryboard}" /> 
        </MultiDataTrigger.EnterActions> 
        <MultiDataTrigger.ExitActions> 
         <BeginStoryboard 
      Storyboard="{StaticResource MyShrinkStoryboard}" /> 
        </MultiDataTrigger.ExitActions> 
       </MultiDataTrigger> 

       <!-- shrink --> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Value="False" 
      Binding="{Binding Path=IsSelected, 
      RelativeSource={RelativeSource 
      Mode=FindAncestor, 
      AncestorType={x:Type ListBoxItem}}}" /> 
         <Condition Value="1" 
      Binding="{Binding Path=SelectedItems.Count, 
      RelativeSource={RelativeSource 
      Mode=FindAncestor, 
      AncestorType={x:Type ListBox}}}" /> 
        </MultiDataTrigger.Conditions> 
        <MultiDataTrigger.EnterActions> 
         <BeginStoryboard 
      Storyboard="{StaticResource MyShrinkStoryboard}" /> 
        </MultiDataTrigger.EnterActions> 
        <MultiDataTrigger.ExitActions> 
         <BeginStoryboard 
      Storyboard="{StaticResource MyGrowStoryboard}" /> 
        </MultiDataTrigger.ExitActions> 
       </MultiDataTrigger>   

      </DataTemplate.Triggers> 
      <TextBlock Text="{Binding .}"> 
      <TextBlock.LayoutTransform> 
       <ScaleTransform ScaleX="1" ScaleY="1" 
      x:Name="MyTransform"/> 
      </TextBlock.LayoutTransform> 
      </TextBlock> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

    <ListBox ItemsSource="{Binding Path=SelectedItems, 
     ElementName=ListBoxA}" Name="ListBoxB"> 
     <ListBox.ItemTemplate> 
     <DataTemplate> 
      <UniformGrid Columns="10"> 
      <!-- repeat this part MANY times (like 3000) ! --> 
      <TextBox Text="{Binding .}" /> 
      <TextBox Text="{Binding .}" /> 
      <TextBox Text="{Binding .}" /> 
      <TextBox Text="{Binding .}" /> 
      <TextBox Text="{Binding .}" /> 
      </UniformGrid> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
    </StackPanel> 
</Page> 

इस तरह लग रहा है:

यहाँ XAML कि वास्तव में समस्या को दर्शाता है (क्योंकि StackOverflow एक सवाल के आकार को सीमित, आप अतिरिक्त बक्सें जोड़ने के लिए वास्तव में देरी काफी देखने के लिए की आवश्यकता होगी) है

enter image description here

धन्यवाद!

उत्तर

0

परिणामी नियंत्रण में दृश्य तत्वों की संख्या को कम करने के अलावा इसे संभालने का कोई तरीका नहीं है। बेशक, आप एक बड़ा पीसी भी खरीद सकते हैं लेकिन यह केवल मजाक कर रहा है।

4

मुझे पहले कभी भी ऐसी ही समस्या नहीं थी और मेरे ज्ञान के अनुसार WPF में डेटा बाध्यकारी में देरी करने के तरीके में कोई भी निर्मित नहीं है।

मैंने ListboxB के अंदर 1000+ टेक्स्टबॉक्स के साथ अपना कोड आजमाया। ListboxB बहुत तेजी से प्रस्तुत करता है लेकिन यदि आप अभी भी ListboxB के लिए प्रतिपादन समय को कम करना चाहते हैं तो आप सूचीबॉक्स में नीचे कोड जोड़ने का प्रयास कर सकते हैं।

VirtualizingStackPanel.IsVirtualizing="True" 
VirtualizingStackPanel.VirtualizationMode="Recycling" 

यह जो वर्तमान में दिखाई दे रहे हैं ListBoxB अंदर ही नियंत्रण उत्पन्न तो यह ListBoxB का प्रतिपादन में सुधार होगा होगा।

आप VirtualizingStackPanel पर अपना आलेख चेकआउट कर सकते हैं।

आशा है कि यह उत्तर आपकी मदद करेगा।

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

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