【问题标题】:WPF Splash Screen WindowsWPF 启动画面窗口
【发布时间】:2011-06-07 17:06:08
【问题描述】:

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

我还需要显示启动画面 5 秒(合同明确规定为 5 秒),不能再短了。我知道 VS 2010 中的构建属性,但启动画面来来去去太快(不到 5 秒)。

我该怎么做才能让它停留 5 秒(大约)

【问题讨论】:

  • Thread.Sleep(5000); 怎么样? :)
  • 对于透明 PNG,您需要 Photoshop 或 Illustrator 之类的工具来保存 Alpha 通道信息。
  • 至于启动画面,您可能只需要添加某种自定义弹出窗口。如果用户可以单击复选框而不必再次显示它,那就太好了。但我怀疑合同是否允许这样做!似乎太多的公司宁愿疏远用户,只要他们进行营销。
  • 我喜欢 Thread.Sleep 的想法。有任何示例代码来说明它吗?
  • 如果 preffer timer 超过线程睡眠

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


【解决方案1】:

我有一个类似的问题,我无法在 WPF 项目中使用内置的启动画面选项。

该项目现已开源,您可以在这里查看: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# 端(代码隐藏):

/// <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.

【讨论】:

  • 此代码是否与 MailApplication 一起使用,还是我创建一个新的 WPF 窗口并将代码(XAML/C#)添加到新窗口?
  • 我在一个单独的项目中制作了我的,但您可以将它放在您的主应用程序中,并在您的应用程序启动之前调用它。
【解决方案2】:

如果我必须这样做,我会添加一个窗口并设置其属性AllowsTransparency = true; 将其设置为在所有表单之前启动,我的意思是在加载之前可以通过修改App.xml 和设置Startup="Application_Startup 来完成 要禁用顶部默认控件,您必须设置 WindowStyle = none 并在其代码中

private void Application_Startup(object sender, StartupEventArgs e)
        {
            MainWindow mn = new MainWindow();
            mn.ShowDialog();          
        }

使用计时器做任何你想做的事

private DispatcherTimer timer;
timer = new DispatcherTimer();
            timer.Tick += new EventHandler(timer_Tick);
            timer.Interval = TimeSpan.FromMilliseconds(5000);
            timer.IsEnabled = true;

void timer_Tick(object sender, EventArgs e)
        {
///Close your window here
}

希望对你有帮助

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,但实际上它非常容易解决,无需任何特殊操作:

    1. 将您的图像添加到主项目并将构建属性设置为启动画面。

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

    这将延迟您的 wpf 主窗口的加载,并且在主窗口弹出和启动画面消失之前,启动画面将至少保持加载时间 + 睡眠时间。

    【讨论】:

      【解决方案4】:

      您可能需要做一些类似于在 WinForms 中所做的事情。启动一个新线程并在该线程上启动一个 Wpf 应用程序。在 WinForms 中,您可以使用 System.Windows.Forms.Application.Run(new SplashForm());在 Wpf 中应该与此类似。

      编辑: 我发现了这个,所以它应该可以工作。 http://msdn.microsoft.com/en-us/library/ms597011.aspx

      关键是在单独的线程上执行此操作。应用程序启动的线程已经绑定到一个 WPF 应用程序,并且您希望您的启动画面基本上是它自己的 GUI。然后表单可以有一个计时器,使其自行关闭,这应该会自动终止这个其他应用程序。

      【讨论】:

        【解决方案5】:

        如果您想要一个启动屏幕窗口并使用后台工作程序,您会使您的主代码更加复杂,因为这不是必需的。解决方案是在主 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]);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-30
          • 1970-01-01
          • 1970-01-01
          • 2019-08-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多