WPF启动屏幕Windows

时间:2011-06-07 17:06:08

标签: c# wpf visual-studio-2010 c#-4.0 splash-screen

我需要有一个PNG(透明度)作为启动画面。图像的透明部分应该清晰,以便用户可以看到它背后的任何窗口(或桌面)。

我还需要显示启动画面5秒钟(合同特别说5秒)并且它不能更短。我知道VS 2010中的build属性,但启动画面过快(不到5秒)。

我该怎么做才能让它停留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)

我遇到了同样的问题,但实际上很容易解决,没有任何特别的问题:

  1. 将您的图片添加到主项目中,并将build属性设置为Splash Screen。

  2. 在InitializeComponents()调用之前,将一个Thread.Sleep(5000)添加到应用程序主窗口的构造函数中。

  3. 这将延迟主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]);
}