2010-09-06 28 views
12

Bir kontrolün durumunu değiştirmem ve ardından bir işlem yapmam gerekiyor. Spesifik olmak gerekirse, bir kontrolün gizlenmesi için bir animasyon çalıştırmak istiyorum. Ben böyle bir şey yapmak istiyorum:Silverlight 4'te durumun değişmesi için geçişin nasıl geçmesi bekleniyor?

VisualStateManager.GoToState(control, "Hidden", true); // wait until the transition animation is finished 
ParentControl.Children.Remove(control); 

sorun geçiş animasyonu uyumsuz çalıştırılır ve böylece kontrol animasyon başladı hemen sonra görsel ağaçtan kaldırılır olmasıdır.

Animasyonun bitmesini nasıl bekleyebilirim?

+0

Bu, WPF'de de çalışır. Gönderi için teşekkürler, tam olarak aradığım şey bu! –

+0

bu şekilde MVVM'de yapılabilir mi? – user20358

cevap

14

Sen Film Şeridine bir Storyboard.Completed olay işleyicisi takmak veya VisualStateGroup bir VisualStateGroup.CurrentStateChanged olay işleyicisi ekleyebilirsiniz:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" 
x:Class="SilverlightApplication7.MainPage" 
Width="640" Height="480"> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="VisualStateGroup" > 
      <VisualState x:Name="Hidden"> 
       <Storyboard Completed="OnHidden"> 
        <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="rectangle" d:IsOptimized="True"/> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <Rectangle x:Name="rectangle" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="136" Margin="48,72,0,0" Opacity="0" Stroke="Black" VerticalAlignment="Top" Width="208"/> 
</Grid> 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

namespace SilverlightApplication7 
{ 
public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     // Required to initialize variables 
     InitializeComponent(); 

     this.Loaded += new RoutedEventHandler(MainPage_Loaded); 
    } 

    void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     VisualStateManager.GoToState(this, "Hidden", true); 
    } 

    private void OnHidden(object storyboard, EventArgs args) 
    { 

    } 
} 

}

+0

Bu, aklıma gelen tek çözümdü. Ama bana göre çok güzel ve temiz görünmüyor. :-(Diğer taraftan, eğer başka bir çözüm yoksa, başka seçeneğim yok. Teşekkür ederim. – gius

+0

Peki ya Özel kontrol kullanıyorsak? Bu durumda, xaml'a –

+0

@ dains çözümleri bu dava için çalışıyor. –

3

doğru yolu Bu sorunu ele alma, VisualStateGroup'ta CurrentStateChanged olayını dinliyor, ancak deneyimlerimden, en iyi ihtimalle güvenilir ve en kötü ihtimalle bozuk değil.

İkinci seçenek Storyboard'unuzdaki Tamamlanmış etkinliği kancalamaktır, ancak bu seçenek kendi başına tuzaklara sahiptir. Bazı durumlarda, görsel durum yöneticisi dahili olarak animasyonlar üretir, böylece ayarladığınız tamamlanmış etkinlik aranmaz.

2

Şifreli Tamamlanan işleyicisi takmak için aslında mümkündür: Bu iplikten

Collection<VisualStateGroup> grps = (Collection<VisualStateGroup>)VisualStateManager.GetVisualStateGroups(this.LayoutRoot); 
foreach (VisualStateGroup grp in grps) { 
    Collection<VisualState> states = (Collection<VisualState>)grp.States; 
    foreach (VisualState state in states) { 
     switch (state.Name) { 
      case "Intro": 
      state.Storyboard.Completed += new EventHandler(Intro_Completed);break; 
     } 
    } 
} 

Örnek: http://forums.silverlight.net/forums/p/38027/276746.aspx

çok bağlı Davranışı kullanarak canlı projede benim için çalışmak! Ancak, VisualStateGroup koleksiyonunu elde etmek için root UserControl (VisualStateManager.GoToState'de kullanmak için) ve LayoutRoot için ayrı bağımlılık özelliklerini kullanmam gerektiğinden biraz rahatsız edici.