2012-06-30 10 views
6

Sto utilizzando un'immagine ospitata su un server nella mia app C#/XAML WinRT. Quando l'immagine viene scaricata, voglio che sbiadisca. Ho notato lo FadeInThemeAnimation che è quello che speravo di usare. Ma, voglio usarlo come un EntranceThemeTransition. C'è un modo per fare questo? se é cosi, come?Utilizzo di FadeInThemeAnimation come transizione in WinRT

risposta

9

Ho incontrato lo stesso problema ma ho trovato una soluzione, ho pensato che potrebbe essere ancora utile condividerla.

Apparentemente FadeInThemeAnimation è un tipo speciale di animazione che non funziona su Opacity e Visibility come si potrebbe pensare, ma su RenderTransform di un oggetto. Sono riuscito a farlo funzionare solo quando svanisco l'oggetto per primo con FadeOutThemeAnimation.

Ma ecco una soluzione alternativa. Nel vostro XAML, aggiungere uno Storyboard alle Risorse del contenitore della vostra immagine, in questo modo:

<Grid> 
    <Grid.Resources> 
     <Storyboard x:Name="ImageFadeInStoryboard"> 
      <DoubleAnimation From="0" To="1" Storyboard.TargetName="yourImage" Storyboard.TargetProperty="Opacity" Duration="0:0:0.6" /> 
     </Storyboard> 
    </Grid.Resources> 
    <Image x:Name="yourImage" Source="{Binding ...}"/> 
... 

quindi aggiungere un gestore per l'immagine ImageOpened evento:

<Image x:Name="yourImage" Source="{Binding ...}" ImageOpened="OnImageOpened"/> 

E nel code-behind:

private void OnImageOpened(object sender, RoutedEventArgs e) 
{ 
    ImageFadeInStoryboard.Begin(); 
} 

Spero che questo aiuti :)

+0

Personalmente non posso usarlo perché ha code-behind. Sembra che non ci sia ANCORA un modo semplice e riutilizzabile per farlo. Voglio dire, chi non ha mai voluto sbiadire un'immagine in caricamento (anche da disco). Incredibile. –

+1

Esiste, è possibile creare una nuova classe che eredita da Immagine e incapsula questo comportamento. È anche possibile creare un comportamento dell'immagine o una proprietà di dipendenza allegata. Ci sono molti modi per farlo senza code-behind. –

2

Un altro approccio è creare un attac comportamento Hed che "ascolta" un valore booleano vincolante per sparare l'animazione a tema:

static class VisibilityAnimationBehavior 
{ 
    public static readonly DependencyProperty IsVisibleProperty = DependencyProperty.RegisterAttached("IsVisible", typeof(bool), typeof(VisibilityAnimationBehavior), new PropertyMetadata(true, IsVisibleChanged)); 
    public static bool GetIsVisible(DependencyObject Target) { return (bool)Target.GetValue(IsVisibleProperty); } 
    public static void SetIsVisible(DependencyObject Target, bool Value) { Target.SetValue(IsVisibleProperty, Value); } 

    static void IsVisibleChanged(DependencyObject Source, DependencyPropertyChangedEventArgs Arguments) 
    { 
     bool OldValue = (bool)Arguments.OldValue; 
     bool NewValue = (bool)Arguments.NewValue; 

     DependencyObject ParentObject = Source as DependencyObject; 
     if(ParentObject == null) 
      return; 

     if(NewValue == true && OldValue != true) 
     { 
      Storyboard TransitionStoryboard = new Storyboard(); 
      Storyboard.SetTarget(TransitionStoryboard, ParentObject); 

      TransitionStoryboard.Children.Add(new FadeInThemeAnimation()); 

      TransitionStoryboard.Begin(); 
     } 
     else if(NewValue == false && OldValue != false) 
     { 
      Storyboard TransitionStoryboard = new Storyboard(); 
      Storyboard.SetTarget(TransitionStoryboard, ParentObject); 

      TransitionStoryboard.Children.Add(new FadeOutThemeAnimation()); 

      TransitionStoryboard.Begin(); 
     } 
    } 
} 

Al fine di collegare il comportamento a un XAML DependencyObject (una griglia in questo esempio) utilizzare il seguente:

<Grid local:VisibilityAnimationBehavior.IsVisible="{Binding Path=TheBooleanBinding}"> 
+0

Grazie. Mi piace questo approccio con proprietà attaccabili. – Sven