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事件??梢杂嗛喫鼇肀O聽動畫是否完成。當動畫完成后,可以調用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 關注
- 190 瀏覽
添加回答
舉報