2010-03-28 18 views

cevap

0

ViewModel'ime hangi Animasyon için bir anahtar dizeyle AnimationStarted olayı ekledim. Daha sonra, görüntüyü programatik olarak oluşturuyorum, AnimationStarted etkinliğine abone oluyorum ve patladığında uygun animasyonu devre dışı bırakıyorum.

1

Sanal makinemde, uygulamanın durumunu yansıtan bir özelliğim var. Görünümündeki animasyonlu öğelerin, sanal makine özelliği belirli bir değere sahip olduğunda bir film şeridi başlatan bir veri tetikleyicisi vardır.

+0

bunu biliyorum. Bir koşul girdiğinizde storyboard'u başlatmak için bir tetikleyici oluşturuyorsunuz. Ama sadece bir kerelik bir animasyon yapmam gerekiyor: Dikkat çekmek için bir UI elemanında hızlı, geçici bir flaş yapmak istiyorum. – RandomEngy

+0

Bunu genelleştirmeyi düşünmedim, bu yüzden size yardımcı olup olmadığını bilmiyorum. Bir zamanlar benzer bir ihtiyacım vardı. Bir dakikası faaliysem bir tuşa basmam gerekiyordu. Bu düğmeye bağlı bir storyboard sahip yaparak yaptım, storyboard bir dakika için hiçbir şey yapmaz sonra flaş yapmak. Benim durumumda, tıklandığında düğmeye basıldı, böylece senaryo daha basit hale geldi. Bir UI öğesindeki bir flaş, yalnızca ilgili olan görünüm gibi dikkat seslerini yakalar. Görünümün kendi kendine ne zaman yanıp söneceğini belirleyebileceği bir yol var mı? VM neden bir UI elemanını yakma konusunda umursadı? Üzgünüm, bu çok yardımcı olmayabilir. – Carlos

+0

Bir pencerede yanan birkaç komut, bu flaşı başka bir pencerede tetikler. Pencereleme modelim, VM'nin pencereler arasındaki ilişkileri bildiği, ancak görünümlerin bulunmadığı şekilde ayarlanmıştır. – RandomEngy

5

Bunu DataTrigger kullanarak ve ViewModel'imdeki bir özelliğe bağlayarak yaptım. "FlashingBackGround" özelliği "ON" olarak ayarlandığında, Storyboard animasyonu başlar. Ayrıca

projenizde bir başvuru için "Microsoft.Expression.Interactions"

XAML eklemeyi unutmayın: (bu kök düğüm doğrudan gider)

<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() 
    { 
     FlashingBackground = "ON"; 
    } 

    private string _FlashingBackround = "OFF"; 

    public string FlashingBackground 
    { 
     get { return _FlashingBackround; } 

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

      _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)); 
     } 
    } 

Son olarak, Viewmodel'in "INotifyPropertyChanged" öğesinden miras alması gerekir

+6

İlginç bir yaklaşım. Ama neden sadece "ON"/"OFF" dizgisi yerine "boolean" kullanmıyorsunuz? –

+0

"System.Windows.Interactivity.dll" dosyasını da eklediğinizden emin olun. –

0

Aynı problemle karşılaştım ve bu yazıların hiçbiri, animasyonlar kodda olduğundan ve bazılarının büyük ve karmaşık ve değişken dalgalanan değişkenler olduğundan, kodda kalmak zorunda kalmaları için gerçekten yardımcı olmadı. Animasyonları tetikleyen kullanıcı denetiminde (görünüm) bağımlılık özellikleri ekleyerek ve bunları görünüm modelindeki özelliklere bağlayarak çözdüm. Bu bir şeyi veya başka bir şeyi ihlal ederse (/ bakım) bilmiyorum, çünkü çok iyi çalışıyor! şerefe, stepp

alıntı: arkasında

(görünüm) UserControl'ın kodu:

public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     SetAnimationBindings(); 
    } 

    private void SetAnimationBindings() 
    { 
     _dialogStartPosition = mbFolderBrowse.Margin; 

     var propName = "StartDialogAnimation"; 
     var binding = new Binding(propName) { Mode = BindingMode.TwoWay }; 
     this.SetBinding(DialogAnimationProperty, binding); 

     propName = "StartProgressAnimation"; 
     binding = new Binding(propName) { Mode = BindingMode.TwoWay }; 
     this.SetBinding(ProgressAnimationProperty, binding); 
    } 

    #region Animation Properties 
    #region DialogAnimation 
    public static readonly DependencyProperty DialogAnimationProperty = 
     DependencyProperty.Register("DialogAnimation", typeof(bool), 
      typeof(Manage), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnDialogAnimationChanged)); 
    public bool DialogAnimation 
    { 

     get { return (bool)this.GetValue(DialogAnimationProperty); } 
     set 
     { 
      var oldValue = (bool)this.GetValue(DialogAnimationProperty); 
      if (oldValue != value) this.SetValue(DialogAnimationProperty, value); 
     } 
    } 

    private static void OnDialogAnimationChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     Manage m = o as Manage; 

     if ((bool)e.NewValue == true) 
      m.SlideInDialogPanel(); // animations 
     else 
      m.SlideOutDialogPanel(); 
    } 
    #endregion 

Görüntüleme Model:

public bool StartDialogAnimation 
{ 
    get { return _startDialogAnimation; } 
    set 
    { 
     if (_startDialogAnimation != value) 
     { 
      _startDialogAnimation = value; 
      RaisePropertyChanged("StartDialogAnimation"); 
     } 
    } 
}