2011-01-16 13 views
24

मैं WPF UserControls (हालांकि FrameworkElement के लिए, इसे अधिक सामान्य बनाने के लिए) के लिए एक फीका प्रभाव (एनीमेशन) जोड़ने की कोशिश कर रहा हूं।उपयोगकर्ता नियंत्रण प्रदर्शित होने पर कौन सी घटना निकाल दी जाती है?

यदि मैं Loaded ईवेंट प्रारंभिक फीड-इन ट्रिगर करता हूं, तो कभी-कभी फीड एनीमेशन उपयोगकर्ता नियंत्रण प्रदर्शित होने से पहले शुरू हो जाएगा। परिणाम एक गड़बड़ है। उदाहरण के लिए ऐसा होता है यदि उपयोगकर्ता कंट्रोल लोडेड इवेंट हैंडलर में एक क्वेरी निष्पादित करने की तरह कुछ लंबा (एक सेकंड के कुछ दसवें) करता है।

तो, मुझे कुछ घटनाओं को संभालने की आवश्यकता होगी, जब सामग्री को प्रस्तुत किए जाने पर फ्रेमवर्क एलिमेंट/उपयोगकर्ता नियंत्रण प्राप्त होता है, और तब फीका-इन शुरू होता है। System.Windows.Window में ContentRendered ईवेंट है, लेकिन UserControl नहीं है। तो, फ्रेमवर्क एलिमेंट (या UserControl) को प्रस्तुत किए जाने पर कौन सी घटना निकाल दी जाती है?

उत्तर

5

शायद IsVisibleChanged आज़माएं, हालांकि इसे बहुत अधिक उपयोग नहीं किया है।

यह घटना तब नहीं उठाई जाती है जब तत्व लेआउट सिस्टम द्वारा प्रदान नहीं किया जा रहा है, अदृश्य संपत्ति के मूल्य के अलावा अन्य कारणों से। उदाहरण के लिए, तत्व में कोई प्रासंगिक दृश्य नहीं हो सकता है।

+1

नहीं उपयोग कर सकते हैं, तत्व IsVisible == सच पहले से ही लोडेड ईवेंट हैंडलर में है। – Batibix

+0

बहुत बुरा, आपका प्रारंभिक कार्य पूरा होने पर मैन्युअल रूप से अपने फीड को ट्रिगर करने के बारे में कैसे? –

+1

समस्या यह है - मुझे इसे कहां ट्रिगर करना चाहिए? लोड की गई घटना को संभालने के बाद, कुछ लंबा अभी भी होता है। यह शायद डब्ल्यूपीएफ डाटाबेसिंग है जो लोडेड इवेंट और यूजर कंट्रोल के प्रदर्शन के बीच डेटाबेस से एंटीटी फ्रेमवर्क लोडिंग को ट्रिगर करता है। – Batibix

6

आप एक निम्न प्राथमिकता के साथ अपने Storyboard की शुरुआत निर्धारित कर सकते हैं, उदाहरण के लिए:

  • Build More Responsive Apps With The Dispatcher
  • :

    Dispatcher.BeginInvoke(BeginStoryboardAction, DispatcherPriority.ContextIdle); 
    

    यहाँ एक लेख इस पद्धति का उपयोग करने के लिए संबंधित मुद्दों पर चर्चा की है कि

18

आकार बदलें पर आकार की जांच करने का प्रयास करें या LayoutUpdated। आप यदि दिखाई दे रहा है या नहीं के लिए ईवेंट हैंडलर की जांच में IsVisibleChnaged घटना असाइन ईवेंट हैंडलर का उपयोग कर सकते काम करो जब वास्तविक चौड़ाई या ऊंचाई नहीं 0.

view.LayoutUpdated+=(o,e)=> 
{ 
    if (!loaded && (view.ActualHeight > 0 || view.ActualWidth > 0)) 
    { 
    // You can also unsubscribe event here. 
    loaded =true; 
    } 
} 
+2

धन्यवाद! मेरे प्रश्नों के लिए बहुत उपयोगी http://stackoverflow.com/q/18724686/352101 – Bolu

4

के बराबर

MyUserControl.IsVisibleChanged += ScheduleUserControl_IsVisibleChanged; 

void _IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    if ((bool)e.NewValue) 
    { 
     //Visible 
    } 
    else 
    { 
     //Not Visible 
    } 
} 
+0

एचबी। पहले से ही अपने जवाब में लिखा है। –

+1

.. और यह क्यों काम नहीं करता है। – Riva

10

साल देर से, लेकिन जब से मैं अब व्यर्थ के बाद से समाधान काम करने के लिए देख रहा था, मैं अपने खोज साझा करना चाहते हैं।

यदि आप किसी भी नियंत्रण (या किसी भी दृश्य या यहां तक ​​कि निर्भरता ऑब्जेक्ट) के लिए ContentRendered ईवेंट चाहते हैं, तो आपको Visual पर खोदना होगा।

// Wait for Control to Load 
void TestUserControl_Loaded(object sender, RoutedEventArgs e) 
{ 
    // Get PresentationSource 
    PresentationSource presentationSource = PresentationSource.FromVisual((Visual)sender); 

    // Subscribe to PresentationSource's ContentRendered event 
    presentationSource.ContentRendered += TestUserControl_ContentRendered; 
} 

void TestUserControl_ContentRendered(object sender, EventArgs e) 
{ 
    // Don't forget to unsubscribe from the event 
    ((PresentationSource)sender).ContentRendered -= testContentRenderedUC_ContentRendered; 

    // .. 
} 

आप नियंत्रण Loaded अन्यथा PresentationSource.FromVisual() के लिए प्रतीक्षा करनी अशक्त रिटर्न:

मैं इस कोड का उपयोग करें।

विभिन्न डिस्पैचर। बेगिन इनवोक विधियां लगातार मेरे लिए काम नहीं करतीं। कभी-कभी नियंत्रण में वास्तव में प्रदर्शित होने से पहले मेरे प्रस्तुत कार्यक्रम को फायर करना।
यह हर बार मेरे लिए काम करता है।

मुझे पता है कि मैं यहां HwndSource के साथ खेल रहा हूं, जो काफी कम स्तर है और मुझे संभावित प्रभावों का यकीन नहीं है। (हो सकता है कि किसी को अधिक अनुभवी विस्तृत कर सकते हैं।)

+3

दुर्भाग्यवश, 'ContentRendered' केवल पहली बार मालिक' विंडो 'प्रस्तुत करने को समाप्त करता है; इसका अर्थ है: यदि यह 'UserControl' (या जो भी' निर्भरता ऑब्जेक्ट') प्रदान किया जाता है ** ** 'सामग्री प्रस्तुत करने' के बाद ** इसे फिर से नहीं फेंक दिया जाएगा। इस समस्या का सामना किया जा सकता है जब आपके पास कुछ नियंत्रण होते हैं जो उपयोगकर्ता इंटरैक्शन के आधार पर आलसी लोड होते हैं। –

1

आप GotFocus घटना

<i:Interaction.Triggers> 
     <i:EventTrigger EventName="GotFocus"> 
      <i:InvokeCommandAction Command="{Binding ContentControlLoadedCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
संबंधित मुद्दे

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