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
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 :)
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}">
Grazie. Mi piace questo approccio con proprietà attaccabili. – Sven
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. –
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. –