DoubleAnimation异常触发?Toast通知动画延迟失效问题求助
解决Toast滑入滑出动画间3500ms延迟不生效的问题
你的问题出在Task.Delay(3500)没有等待完成就直接执行了滑出动画——Task.Delay是异步方法,不加await的话,代码会跳过延迟直接往下走,导致两个动画连续播放。下面给你三种可行的解决办法:
方法一:用async/await等待延迟完成
修改后台方法为异步,通过await等待延迟结束后再执行滑出动画:
async void ShowToast(string Header, string Content) { ToastHeader.Text = Header; ToastContent.Text = Content; Storyboard ToastIN = (Storyboard)FindResource("ToastIN"); ToastIN.Begin(); await Task.Delay(3500); Storyboard ToastOUT = (Storyboard)FindResource("ToastOUT"); ToastOUT.Begin(); }
方法二:监听滑入动画的Completed事件
如果场景不允许用async/await,可以监听滑入动画的完成事件,在事件里处理延迟和滑出:
void ShowToast(string Header, string Content) { ToastHeader.Text = Header; ToastContent.Text = Content; Storyboard ToastIN = (Storyboard)FindResource("ToastIN"); Storyboard ToastOUT = (Storyboard)FindResource("ToastOUT"); ToastIN.Completed += (sender, args) => { Task.Delay(3500).ContinueWith(_ => { // 必须在UI线程执行动画,所以用Dispatcher调用 Dispatcher.Invoke(() => ToastOUT.Begin()); }); }; ToastIN.Begin(); }
方法三:合并动画到一个Storyboard(推荐)
直接在XAML里把滑入、延迟、滑出整合成一个完整的Storyboard,不需要后台处理逻辑,更符合WPF动画的设计方式:
<Window.Resources> <Storyboard x:Key="ToastFullAnimation"> <!-- 滑入动画:1秒完成 --> <DoubleAnimation From="501" To="0" Duration="0:0:1" Storyboard.TargetName="Toast" Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" /> <!-- 滑出动画:滑入完成后延迟3.5秒(总共4.5秒后)开始执行 --> <DoubleAnimation BeginTime="0:0:4.5" From="0" To="501" Duration="0:0:1" Storyboard.TargetName="Toast" Storyboard.TargetProperty="(UIElement.RenderTransform).(TranslateTransform.X)" /> </Storyboard> </Window.Resources>
后台代码简化为:
void ShowToast(string Header, string Content) { ToastHeader.Text = Header; ToastContent.Text = Content; Storyboard ToastFull = (Storyboard)FindResource("ToastFullAnimation"); ToastFull.Begin(); }
内容的提问来源于stack exchange,提问作者user14656140
相关产品推荐
相关产品推荐

