3 回答
TA贡献1815条经验 获得超13个赞
带有故事板的 XML 动画;
<Storyboard x:Name="BackgroundImageStoryboardIncrease">
<DoubleAnimation
Storyboard.TargetName="BackgroundImage"
Storyboard.TargetProperty="Opacity"
From="0"
To="0.15"
Duration="0:0:2" />
</Storyboard>
<Storyboard x:Name="BackgroundImageStoryboardDecrease">
<DoubleAnimation
Storyboard.TargetName="BackgroundImage"
Storyboard.TargetProperty="Opacity"
From="0.15"
To="0"
Duration="0:0:2" />
</Storyboard>
C# 更改事件并等待 10 秒:
private async void InitializeFrontWorks()
{
// Animations
DispatcherTimer dispatcherTimer = new DispatcherTimer
{
Interval = TimeSpan.FromSeconds(10)
};
var backgroundImageFolder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(@"Assets\BackgroundImages");
var backgroundImageFiles = await backgroundImageFolder.GetFilesAsync();
AnimationBackgroundImage(backgroundImageFiles);
dispatcherTimer.Tick += delegate
{
AnimationBackgroundImage(backgroundImageFiles);
};
dispatcherTimer.Start();
}
private void AnimationBackgroundImage(IReadOnlyList<StorageFile> backgroundImageFiles)
{
BackgroundImageStoryboardDecrease.Begin();
BackgroundImageStoryboardDecrease.Completed += delegate
{
BackgroundImage.Source = new BitmapImage(new Uri(backgroundImageFiles[new Random().Next(0, backgroundImageFiles.Count)].Path));
BackgroundImageStoryboardIncrease.Begin();
};
}
TA贡献1876条经验 获得超6个赞
您可以在 XAML 中设置以下动画:
<Page.Resources>
<Storyboard x:Name="MyStoryboard">
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="BackgroundImage">
<EasingDoubleKeyFrame KeyTime="0" Value="0"/>
<EasingDoubleKeyFrame KeyTime="0:0:3" Value="0.1"/>
<EasingDoubleKeyFrame KeyTime="0:0:6" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Page.Resources>
隐藏代码:
可以使用StoryBoard.Begin来启动Opacity动画,动画有Completed事件。可以订阅它来监听动画是否完成。当动画完成后,可以调用InitializeWorks()方法再次更改BackgroundImage。这种写法替换您的While方法。
private async void InitializeWorks()
{
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
{
BackgroundImage.Opacity = 0;
try
{
var backgroundImageFolder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync(@"Assets\BackgroundImages");
var backgroundImageFiles = await backgroundImageFolder.GetFilesAsync();
BackgroundImage.Source = new BitmapImage(new Uri(backgroundImageFiles[new Random().Next(0, backgroundImageFiles.Count)].Path));
MyStoryboard.Begin();
MyStoryboard.Completed += MyStoryboard_Completed;
}
catch (Exception e)
{
//
}
});
}
private void MyStoryboard_Completed(object sender, object e)
{
InitializeWorks();
}
TA贡献1789条经验 获得超10个赞
您无法在 XAML 中调用GetFolderAsync
或GetFilesAsync
,但我建议您将循环替换while
为定期更改背景的DispatcherTimer 。
该Tick
事件将在 UI 线程上引发,这意味着可以安全地在事件处理程序中访问 UI 元素。异步方法不会阻塞。
- 3 回答
- 0 关注
- 140 浏览
添加回答
举报