我需要有一个PNG(透明度)作为启动画面。图像的透明部分应该清晰,以便用户可以看到它背后的任何窗口(或桌面)。
我还需要显示启动画面5秒钟(合同特别说5秒)并且它不能更短。我知道VS 2010中的build属性,但启动画面过快(不到5秒)。
我该怎么做才能让它停留5秒钟(大约)
答案 0 :(得分:5)
如果我必须这样做,我会添加一个窗口并设置其属性AllowsTransparency = true;
将其设置为在加载之前所有表单开始之前可以通过修改App.xml
并设置{{1 }}
要禁用顶级默认控件,您必须设置Startup="Application_Startup
并在其代码中
WindowStyle = none
使用计时器做你想做的事情
private void Application_Startup(object sender, StartupEventArgs e)
{
MainWindow mn = new MainWindow();
mn.ShowDialog();
}
希望这会有所帮助
答案 1 :(得分:5)
我遇到了类似的问题,我无法在WPF项目中使用内置的splashscreen选项。
该项目现已开源,您可以在这里查看:https://code.google.com/p/theomniscientchimp/
这是一个自动更新程序(我猜你不需要一些东西)。
这是您应该达到的最低要求:
WPF方:
<Window x:Class="TheOmniscientChimp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CustomXaml"
Icon="SC2_Replay_Monkey.ico"
Title="MainWindow" Height="256" Width="456" Background="#00005555" AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterScreen" >
<Grid Width="Auto">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Image Name="splashScreenImage" Stretch="Fill" Grid.Row="0" />
</Grid>
</Window>
C#side(代码背后):
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
BitmapImage splashScreenImageSource = new BitmapImage();
splashScreenImageSource.BeginInit();
splashScreenImageSource.UriSource = new Uri("Your_Image.png", UriKind.Relative);
splashScreenImageSource.EndInit();
splashScreenImage.Source = splashScreenImageSource;
}
public void AsynchronousExit()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
//Makes the thread wait for 5s before exiting.
Thread.Sleep(5000);
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Environment.Exit(0);
}
}
告诉我你是否需要帮助来调整。
FB。
答案 2 :(得分:1)
我遇到了同样的问题,但实际上很容易解决,没有任何特别的问题:
将您的图片添加到主项目中,并将build属性设置为Splash Screen。
在InitializeComponents()调用之前,将一个Thread.Sleep(5000)添加到应用程序主窗口的构造函数中。
这将延迟主wpf窗口的加载,并且启动屏幕将保持至少加载时间+睡眠时间,然后主窗口弹出并且飞溅消失。
答案 3 :(得分:0)
你可能需要做类似于你在WinForms中所做的事情。启动一个新线程并在该线程上启动Wpf应用程序。在WinForms中,您可以使用System.Windows.Forms.Application.Run(new SplashForm())来完成此操作;在Wpf中应该是类似的东西。
编辑: 我找到了这个,所以它应该工作。 http://msdn.microsoft.com/en-us/library/ms597011.aspx
关键是在单独的线上执行此操作。应用程序启动的线程已经绑定到一个WPF应用程序,并且您希望您的启动基本上是它自己的GUI。然后,表单可以有一个计时器,使其自行关闭,这应该自动终止其他应用程序。
答案 4 :(得分:0)
如果您使用想要一个启动画面窗口并使用后台工作程序,则可以使主代码更加复杂,因为它不是必需的。解决方案是在主UI线程中将主代码编写为普通的同步代码样式,同时显示启动窗口直到关闭它,并且您可以发送更新以更改启动屏幕加载文本或进度条。
SplashWindow window = null;
var thread = new Thread(new ThreadStart(() =>
{
Debug.Print("Thread begin");
window = new SplashWindow();
window.ShowDialog();
}));
thread.Name = "RunSplashWindow";
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
Debug.Print("App begin");
Thread.Sleep(1000);
if (window != null)
{
window.Dispatcher.BeginInvoke(new Del(() => {
window.SetHeader("Running...");
}), new object[0]);
}
Thread.Sleep(1000);
for (int i = 1; i <= 100; i++)
{
if (window != null)
{
window.Dispatcher.BeginInvoke(new Del(() =>
{
window.SetProgress((double)i);
}), new object[0]);
}
Thread.Sleep(10);
}
Thread.Sleep(1000);
Debug.Print("App end");
if (window != null)
{
window.Dispatcher.BeginInvoke(new Del(() =>
{
window.Close();
}), new object[0]);
}