2011-03-22 12 views
6

मैं एक एनीमेशन XAML में परिभाषित किया गया (एक UserControl के रूप में) है कि अनिवार्य रूप से दो छवियों हर दूसरे के बीच स्विच में बना WPF स्टोरीबोर्ड को रोकने के लिए कैसे:केवल XAML

<UserControl x:Class="KaleidoscopeApplication.Controls.RemoteAnimation" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Loaded="RemoteAnimation_Loaded" 
    Unloaded="RemoteAnimation_Unloaded"> 

    <Grid Canvas.Left="500" Canvas.Top="84"> 
     <Grid.Triggers> 
      <EventTrigger RoutedEvent="Grid.Loaded"> 
       <BeginStoryboard> 
        <Storyboard x:Name="storyboard" RepeatBehavior="Forever"> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="remote2" BeginTime="00:00:00" Storyboard.TargetProperty="(UIElement.Visibility)"> 
          <DiscreteObjectKeyFrame KeyTime="0:0:1"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Collapsed</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
          <DiscreteObjectKeyFrame KeyTime="0:0:2"> 
           <DiscreteObjectKeyFrame.Value> 
            <Visibility>Visible</Visibility> 
           </DiscreteObjectKeyFrame.Value> 
          </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
     </Grid.Triggers> 

     <Image Name="remote1" Source="/Resources/Elements/Images/341.png"/> 
     <Image Name="remote2" Source="/Resources/Elements/Images/342.png"/> 

    </Grid> 

</UserControl> 

यह एक खिड़की thusly में इस्तेमाल किया जा सकता है:

<!-- Remote --> 
<uControl:RemoteAnimation 
    x:Name="remoteAnimation" 
    Canvas.Left="316" Canvas.Top="156" Height="246" Width="121" /> 

मेरे समस्या यह है कि जब एनीमेशन युक्त खिड़की बंद कर देता है, यह चल रहा है पर रखता है और एक रिसाव का कारण बनता है। मैं Storyboard के साथ RemoteAnimation_Unloaded() के माध्यम से एनीमेशन को रोकने में सक्षम नहीं हूँ। रोकें() ... यह जैक नहीं करता है।

मैं उन पदों की दोनों की जाँच की है, लेकिन वे लागू नहीं है:

Post1 Post2

मैं उतार विधि में प्राप्त करने में सक्षम हूँ, लेकिन बुला बंद करो() बंद नहीं होता एनीमेशन। मेरी समझ से, स्टोरीबोर्ड के लिए शुरू करने के लिए कॉल() के साथ यह एक मुद्दा हो सकता है। एक isrolrolable पैरामीटर के साथ एक अधिभार है। हालांकि, चूंकि एनीमेशन पूरी तरह से एक्सएएमएल में है, इसलिए मुझे यकीन नहीं है कि इसे कैसे प्रभावित किया जाए।

उत्तर

9

ऐसा लगता है कि मैं दो अलग-अलग मुद्दों में चल रहा था:

पहले, .NET 3.5 में, स्टोरीबोर्ड एनिमेशन रिसाव कर सकते हैं अप्रबंधित स्मृति (यूघ): Link, Link

चूंकि मेरे पास .NET 4.0 पर मेरे लक्ष्यों को अपडेट करने का विकल्प नहीं है, इसलिए मैंने लिंक में वर्णित पैच का उपयोग किया और इसने रिसाव को रोक दिया है।

दूसरा, मैं सफलतापूर्वक अपने UserControl के अनलोडेड ईवेंट को हुक करने में सक्षम था, जिसे विंडो में बंद होने पर कहा जाता है। मुझे लगता है कि इस घटना के साथ दूसरों को ठीक से फायरिंग में परेशानी हुई है, लेकिन ऐसा लगता है कि यह मेरे लिए काम करता है। केवल एनीमेशन (जो "फॉरएवर" के RepeatBehavior साथ XAML के माध्यम से शुरू किया गया था) को रोकने के लिए तरीका है:

storyboard.Begin(this, true); 
storyboard.Stop(this); 

यह एनिमेशन बंद हो और जीसी यह इकट्ठा करने के लिए अनुमति देता है।

+2

धन्यवाद, मैं अपने "हमेशा के लिए" एनीमेशन को रोकने के लिए एक रास्ता तलाश रहा था लेकिन बस स्टॉप (यह) ने इसे नहीं किया। स्टार्ट (इस) विधि में "सत्य" जोड़ना चाल था। –

+0

12 ओवरलोड के साथ शुरुआती विधि के इस गैर स्पष्ट एपीआई डिजाइन ने मुझे भी मिला है। डिफ़ॉल्ट को नियंत्रित किया जाना चाहिए क्योंकि एनिमेशन परिभाषा गतिशील हैं और शुद्ध xaml appraoach के साथ करना मुश्किल है। –

1

कृपया इन दो पदों पढ़ें:

Unloaded event not triggered

Disposing UserControls

+0

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

+0

आपने इसे प्रश्न में क्यों नहीं जोड़ा? कृपया अभी ऐसा करें। –

+0

क्या आपने कोशिश की है: स्टोरीबोर्ड। स्टॉप (यह)? –