WPF

2008-11-13 7 views
8

में एनिमेशन लॉन्च करने के लिए डेटा बाध्यकारी का उपयोग करना मैं मॉडल-व्यू-व्यू मॉडेल पैटर्न का उपयोग करने के लिए एक सरल WPF एप्लिकेशन को अनुकूलित करने का प्रयास कर रहा हूं।WPF

<Page.Resources> 
    <Storyboard x:Name="storyboardRight" 
       x:Key="storyboardRight"> 
     <DoubleAnimation x:Name="da3" 
         Storyboard.TargetName="labelRight" 
         Storyboard.TargetProperty="Opacity" 
         From="0" 
         To="1" 
         Duration="0:0:0.5" /> 
     <DoubleAnimation x:Name="da4" 
         Storyboard.TargetName="labelRight" 
         Storyboard.TargetProperty="Opacity" 
         From="1" 
         To="0" 
         BeginTime="0:0:1" 
         Duration="0:0:0.5" /> 
    </Storyboard> 
    ... 
</Page.Resources> 

वर्तमान में मैं पीछे कोड में एनीमेशन शुरू करते हैं, और जब यह निम्न कोड के साथ खत्म कुछ करने के लिए पूरे घटना को सुन सकते हैं:

storyboardRight = (Storyboard)TryFindResource("storyboardRight"); 
storyboardRight.Completed += new EventHandler(storyboardRight_Completed); 
storyboardRight.Begin(this); 
अपने पन्ने पर मैं एनिमेशन की एक जोड़ी

क्या मेरे व्यूमोडेल में स्टोरीबोर्ड को बाध्यकारी डेटा का कोई तरीका है ताकि यह व्यूमोडेल द्वारा उठाए गए ईवेंट पर शुरू हो और जब यह समाप्त हो जाए तो उस व्यूमोडेल में कॉल-बैक कर सकता है?

उत्तर

9

मुझे इस प्रश्न को माइक्रोसॉफ्ट के जोश ट्विस्ट को रखने का अवसर मिला, जिसने कृपया इस समस्या का उत्तर देने के लिए समय निकाला। समाधान स्टोरीबोर्ड लॉन्च करने के लिए व्यूमोडेल में एक enum के साथ संयोजन में DataTrigger का उपयोग करना है, और इसके बदले में पृष्ठ को ContentPresenter में डालने की आवश्यकता है। एनीमेशन पूर्णता को संभालने के लिए, ViewModel पर ICommand में कॉल करने के लिए कोड की एक छोटी राशि की आवश्यकता थी।

समाधान के पूर्ण विवरण के लिए जोश की पोस्ट here पढ़ें।

+0

यह समाधान केवल पृष्ठ को एक cpntentPresenter में डालने की आवश्यकता है यदि आप इसका उपयोग करते हैं DataTemplate। यदि आप नियंत्रण के गुणों को एनिमेट कर रहे हैं तो डेटा टेम्पलेट के ट्रिगर्स की बजाय नियंत्रण की अपनी शैली के ट्रिगर्स में इसका उपयोग करना संभव है। –

+0

जोश ट्विस्ट्स साइट का लिंक टूटा हुआ है। स्पष्ट रूप से जोश की पूरी साइट तोड़ दी गई है (कोई ब्लॉग लेख लोड नहीं होता है) और जब मैं उसे ईमेल करने का प्रयास करता हूं तो यह केवल उछालता है। किसी को पता है कि जोश से संपर्क कैसे करें और स्थिति का समाधान कैसे करें? –

+0

@ सिमोन गिलबी मैंने उन्हें ट्विटर –

1

आपको EventTrigger का उपयोग करने की आवश्यकता है। यह article about Animations in WPF मदद कर सकता है। एमएसडीएन और How to: Use Event Triggers to Control a Storyboard After It Starts पर Routed Events Overview भी देखें।

+0

धन्यवाद सूचक, लेकिन EventTrigger के लिए सभी दस्तावेज़ दिखाते हैं कि यह मौजूदा फ्रेमवर्क एलिमेंट से आने वाली किसी ईवेंट द्वारा ट्रिगर किया जा रहा है। अब मैं अपने व्यूमोडेल से रूटेडडेंट को फायर कर रहा हूं लेकिन यह नहीं देख सकता कि XAML को सब्सक्राइब करने के लिए कैसे प्राप्त करें:

1

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

इसके अलावा

अपनी परियोजना में एक संदर्भ के लिए "Microsoft.Expression.Interactions"

XAML शामिल करना सुनिश्चित करें: (इस सीधे रूट नोड में चला जाता है)

<Window 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
    x:Name="window" > 
    ... 

    <i:Interaction.Triggers> 
     <ei:DataTrigger Binding="{Binding FlashingBackground, Mode=OneWay}" Value="ON"> 
     <ei:ControlStoryboardAction Storyboard="{StaticResource MyAnimation}"  
               ControlStoryboardOption="Play"/> 
     </ei:DataTrigger> 
    </i:Interaction.Triggers> 

    ... 
</Window> 

ViewModel:

private void TurnOnFlashingBackround() 
    { 
     this.FlashingBackground = "ON"; 
    } 

    private string _FlashingBackround = "OFF"; 

    public string FlashingBackground 
    { 
     get { return this._FlashingBackround; } 

     private set 
     { 
      if (this.FlashingBackground == value) 
      { 
       return; 
      } 

      this._FlashingBackround = value; 
      this.OnPropertyChanged("FlashingBackground"); 
     } 
    } 

    public new event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(
       this, 
       new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

अंत में, व्यूमोडेल को "INotifyPropertyChanged" से प्राप्त होना चाहिए

+0

पर एक संदेश भेजा है यह भी ध्यान दें: आपको दो असेंबली संदर्भों की आवश्यकता है: System.Windows.Interactivity और उपर्युक्त माइक्रोसॉफ्ट.एक्सप्रेस। इंटरैक्शन। – eFloh

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