Задержка окна для заставки - PullRequest
2 голосов
/ 23 августа 2011

Я занимаюсь разработкой проекта и хочу добавить к нему заставку.Я проверил здесь вопросы о Stackoverflow и других блогах, MSDN и т. Д., Но не смог найти решение, которое искал.

Я хочу, чтобы мой SplashScreen,

1- появлялся и оставался на экране 3-4 секунды, но в то же время я хочу, чтобы мое главное окно НЕ появлялось.Когда заставка полностью исчезнет, ​​должно появиться главное окно.Многие из примеров, которые я проверил, не реализуют это.Несмотря на то, что я установил SplashScreen.Close. (TimeSpan.FromMiliseconds (4000)) MainWindow по-прежнему находится непосредственно перед или сзади SplashScreen.Они говорят: «добавьте изображение в ваш проект, сделайте его Build Action SplashScreen или Resource, если вы хотите обработать время затухания, перейдите в файл App.xaml.cs и реализуйте свой собственный метод Main () и примените свою логику».Я это уже знаю.Это не работает.

2- Если возможно, я хочу, чтобы мой экран-заставка НЕ ​​Блекло исчезал.Я хочу, чтобы он внезапно исчез. (Если это невозможно или действительно трудно для промежуточного разработчика, это нормально. Вы можете не обращать на это внимания.)

И, пожалуйста, я хочу, чтобы код C # не Xaml.Мой проект основан на профиле клиента WPF и .NET 4.0.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 23 августа 2011

Почему бы вам не сделать свой экран-заставку полностью квалифицированным 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">

Затем в событии загрузки своего окна-заставки вы инициализируетеглавное окно (желательно где-то еще, чтобы экземпляр закрывался при закрытии заставки).Отсюда вы также можете указать таймер на 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();
}

Вы должны будете изменить поведение главного окна своего приложения, в противном случае закрытиевсплывающее окно приведет к закрытию приложения.

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

Также не забудьте утилизировать таймер, когда закончите.Это IDisposable и будет продолжать использовать этот метод, пока он не будет остановлен.

1 голос
/ 20 сентября 2011

Есть ответы, но я нахожу более простой.Просто используйте метод Thread.Sleep(int miliSeconds) в конструкторе главного окна.Это задержит ваше приложение, чтобы открыть указанные миллисекунды позже.

0 голосов
/ 13 декабря 2012

Лучший способ и использование API это

  SplashScreen splash = new SplashScreen("splashscreen.jpg");
  splash.Show(false);
  splash.Close(TimeSpan.FromMilliseconds(2));
  InitializeComponent();
0 голосов
/ 24 августа 2011

В конструкторе 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;
        }
    }
...