我有一个闪屏,我想淡入,而我的应用程序启动并执行某些操作,然后一旦完成,如果已经过了一定的时间,关闭启动屏幕并加载主屏幕。
我得到的问题是,当我循环检查时间是否已经过去时,似乎没有处理我的故事板以淡入启动画面。
在阅读完之后,我想我应该在另一个线程上启动启动画面?
下面是代码:
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
MySplashScreen splash = new MySplashScreen();
splash.Show();
Stopwatch sw = new Stopwatch();
sw.Start();
while (sw.Elapsed.TotalSeconds < 10)
{
}
splash.Close();
MainWindow mw = new MainWindow();
mw.Show();
}
}
问题是我添加动画时。它就像它没有应用任何处理器的淡入淡出,因为它卡在while循环中。
<Window x:Class="Splash_Demo.MySplashScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="550" Width="900" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" WindowStyle="None" ShowInTaskbar="False" Background="Transparent" AllowsTransparency="True" Opacity="0">
<Window.Triggers>
<EventTrigger RoutedEvent="Window.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="00:00:03" Storyboard.TargetProperty="Opacity" To="1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Window.Triggers>
<Canvas Height="498" Width="839">
<Canvas.Background>
<ImageBrush ImageSource="C:\Users\Ash\Downloads\XactSplash.png"/>
</Canvas.Background>
<Label Canvas.Left="291" FontFamily="Algerian" Canvas.Top="413" Name="Customer" Height="43" Width="185" HorizontalContentAlignment="Left" VerticalContentAlignment="Center"/>
<Image Canvas.Left="500" Canvas.Top="165" Height="164" Name="image1" Stretch="Fill" Width="211" Source="C:\Users\Ash\Downloads\Zerix.bmp" />
<Label Canvas.Left="191" Canvas.Top="376" FontSize="8" Content="Label" Height="19" Name="lblYear" Width="30" HorizontalContentAlignment="Left" VerticalContentAlignment="Center" />
</Canvas>
</Window>
答案 0 :(得分:2)
你正忙着等待,导致UI线程阻塞,并在此过程中占用大量CPU。而是在Application_Startup中设置一个计时器,并在它到期时打开主窗口。
答案 1 :(得分:1)
在“while”循环中,当您的UI线程被阻止(因此等待运行动画)时,您无法运行任何动画。请尝试使用DispatcherTimer
代替
答案 2 :(得分:0)
使用API的最佳方法是
SplashScreen splash = new SplashScreen("splashscreen.jpg");
splash.Show(false);
splash.Close(TimeSpan.FromMilliseconds(2));
InitializeComponent();