2011-08-23 102 views
2

我正在开发一个项目,我想添加一个启动画面。我在这里检查了Stackoverflow和其他博客和MSDN等问题,但无法找到我正在寻找的解决方案。延时窗口飞溅屏幕

我希望我的闪屏,

1出现并在屏幕上停留3-4秒,但在同一时间,我想我的主窗口不出现。当我的启动画面完全消失时,应出现主窗口。我已经检查过的很多例子都没有实现。尽管我设置了SplashScreen.Close(TimeSpan.FromMiliseconds(4000)),但MainWindow仍立即显示在SplashScreen的前面或后面。他们说:“将图像添加到您的项目中,使其成为Build Action SplashScreen或Resource,如果您想要处理淡出时间,请转到App.xaml.cs文件并实施您自己的Main()方法并放置您的逻辑。”我已经知道了。这是行不通的。

2-如果可能我希望我的splashscreen不要慢慢淡出。我想让它突然消失(如果这对于中间开发者来说不可行或者确实很难,那么可以忽略)

而且我希望C#代码不是Xaml。我的项目基于WPF和.NET 4.0客户端配置文件。

谢谢。

+1

你做WPF和你不想XAML? –

+0

我主要更喜欢C#代码。我的意思是包含C#和Xaml的答案都是完美的。 – msharpp

回答

1

有答案,但我找到了一个更简单的一个。只需在主窗口的构造函数中使用Thread.Sleep(int miliSeconds)方法即可。这会延迟您的应用,以便稍后打开指定的毫秒。

+0

值得注意的是,你不应该在.NET中调用'Thread.Sleep'。现在,“任务”。延迟“方法更好,因为它不会冻结UI。 – Sheridan

4

你为什么不使你的闪屏完全合格的XAML <window>并在App.xaml中设置它为您的StartupUri:

<Application x:Class="MyApp.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="SplashWindow.xaml"> 
在启动窗口的Load事件

然后你初始化主窗口(最好在其他地方,因此当你关闭飞溅时,实例会继续存在)。从这里您还可以指定一个x秒钟计时器,以显示主窗口/隐藏飞溅窗口。

using System.Threading; 

/// ------------------------------- 

private Timer t; 

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    App.MainWindow = new MainWindow(); // Creates but wont show 

    t = new Timer(new TimerCallback(CloseSplash), null, new TimeSpan(0,0,10), new TimeSpan(0,0,0,0,-1)); 

    // Do Other load stuff here? 
} 

private void CloseSplash(object info) 
{ 
    // Dispatch to UI Thread 
    Dispatcher.Invoke(DispatcherPriority.Normal, x => CloseSplashMain()); 
} 

private void CloseSplashMain() 
{ 
    App.MainWindow.Show() 
    this.Close(); 
} 

虽然您必须更改应用程序的主窗口行为,否则关闭splash窗口将导致应用程序关闭。

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     App.Current.ShutdownMode = ShutdownMode.OnLastWindowClose; 
    } 
} 

另外,不要忘记当你完成后处置你的计时器。这是一个IDisposable,并会继续触发该方法,除非它停止。

0

在App.xaml.cs的构造函数中打开您的启动画面,等待几秒钟,然后关闭,然后再继续应用程序的其余部分。我使用的是Unity,所以我在Boostrapper初始化一些服务之后关闭了启动画面。

public partial class App : Application 
    { 
     private static SplashScreen _splashScreen; 

     public App() 
     { 
      OpenSplashScreen(); 
      new Bootstrapper().Run(); 
     } 

     private void OpenSplashScreen() 
     { 
      _splashScreen = new SplashScreen("SplashScreen/splash.jpg"); 
      _splashScreen.Show(false); 
     } 

     internal static void CloseSplashScreen(double time) 
     { 
      _splashScreen.Close(TimeSpan.FromSeconds(0)); 
      _splashScreen = null; 
     } 
    } 

其中Bootstrapper.cs如下表所示:

public class Bootstrapper : UnityBootstrapper 
    { 
     protected override void ConfigureContainer() 
     { 
      base.ConfigureContainer(); 
      var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); 
      section.Configure(Container); 

      // initialize some services before 

      App.CloseSplashScreen(0); 

     } 

     protected override IModuleEnumerator GetModuleEnumerator() 
     { 
      return new ExtendedConfigurationModuleEnumerator(); 
     } 

     protected override DependencyObject CreateShell() 
     { 
      MainWindow shell = new MainWindow(Container); 
      shell.Show(); 
      return shell; 
     } 
    } 
0

的最佳方式,并使用API​​是

SplashScreen splash = new SplashScreen("splashscreen.jpg"); 
    splash.Show(false); 
    splash.Close(TimeSpan.FromMilliseconds(2)); 
    InitializeComponent();