【问题标题】:How to create a fade-in animation for a newly created control in C# UWP如何在 C# UWP 中为新创建的控件创建淡入动画
【发布时间】:2018-08-24 12:14:40
【问题描述】:

所以,一个简单的问题,但我现在无法弄清楚。在我的 C# XAML UWP 应用程序中,我正在加载一系列照片。我想为每张新创建的照片制作淡入动画。照片对象在代码隐藏中创建如下。

//getting the photos into the scroller
foreach (StorageFile current_file in GlobalVars.glo_lst_image_files)
{
    Image current_image = new Image();
    BitmapImage current_bitmapimage = new BitmapImage();
    await current_bitmapimage.SetSourceAsync(await current_file.OpenAsync(FileAccessMode.Read));
    current_bitmapimage.DecodePixelWidth = image_width;
    current_image.Source = current_bitmapimage;
    current_image.Width = image_width;

    current_image.Style = App.Current.Resources["ImagePhotoScroller"] as Style;
    current_image.Loaded += new RoutedEventHandler(OnPhotoScrollerImageLoad);

    stack_photoscroller.Children.Add(current_image);
}

这个想法是OnPhotoScrollerImageLoad 将在照片的Loaded 事件上开始一个淡入故事板。如何做到这一点是我遇到困难的地方。我已经尝试了一些方法。

我尝试如下在 C# 中创建整个动画。

private void OnPhotoScrollerImageLoad(object sender, RoutedEventArgs e)
{
    var storyboard = new Storyboard();
    var doubleAnimation = new DoubleAnimation();
    doubleAnimation.Duration = TimeSpan.FromMilliseconds(1000);
    doubleAnimation.EnableDependentAnimation = true;
    doubleAnimation.From = 0;
    doubleAnimation.To = 1;

    Storyboard.SetTargetProperty(doubleAnimation, "Opacity");
    Storyboard.SetTarget(doubleAnimation, sender);
    storyboard.Children.Add(doubleAnimation);
    storyboard.Begin();
}

我无法正确定位目标。使用sender 时会出错。在我以前的应用程序中,我只会为在 XAML 中命名的预先存在的对象设置动画。我不确定如何正确设置此参数。

我还尝试在 XAML 中制作动画,如下所示。

<Storyboard x:Name="PhotoScrollerImageLoadFade">
    <DoubleAnimation x:Name="PhotoScrollerImageLoadFade_dblanim" 
                        Storyboard.TargetProperty="Opacity"
                        From="0" To="1" 
                        Duration="0:0:1"/>
</Storyboard>

然后在 C# 中设置目标

private void OnPhotoScrollerImageLoad(object sender, RoutedEventArgs e)
{
    Storyboard.SetTarget(PhotoScrollerImageLoadFade_dblanim, sender);
    PhotoScrollerImageLoadFade.Begin();
}

但同样,sender 不起作用。我应该如何做到这一点?

【问题讨论】:

  • 哪个错误?您是否尝试过使用投射(DependencyObject)sender
  • @Sinatr 我想我应该包括在内,它是“无法从 'object' 转换为 'Windows.UI.Xaml.DependencyObject'”。您的解决方案完美运行。我知道这会很简单。如果您编写了正确的解决方案,我可以将您的解决方案标记为正确。

标签: c# xaml animation uwp


【解决方案1】:

无法从“对象”转换为“Windows.UI.Xaml.DependencyObject”

所有事件都有sender参数定义为object(不要问我why)。

Loaded 事件中senderFrameworkElementStoryboard.SetTarget 需要 DependencyObject,因此您可以简单地将 sender 转换为它(FrameworkElement 继承自 DependencyObject):

Storyboard.SetTarget(someTimeline, (DependencyObject)sender);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2020-04-01
    相关资源
    最近更新 更多