2012-12-12 3 views
4

Мое приложение в WPF загружает внешние ресурсы, поэтому я хочу показать форму загрузки во время загрузки программы.Показать окно загрузки

Я попытался создать форму и показать перед кодом загрузки и закрыть, когда загрузка закончилась.

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    LoadForm lf = new LoadForm(); 
    lf.Visibility = Visibility.Visible; 

    // Al code that delays application loading 

    lf.Close(); 
} 

Но единственное, что я получаю, это то, что форма отображается при завершении загрузки и немедленно закрывается.

Я думаю, что мне нужно использовать System.Threading, но не уверен.

Спасибо.

Примечание Я загружаю все внешние ресурсы приложения в метод Window_Loaded(), а не в метод основного класса.

+0

Я думаю, что вы находитесь на правильном пути, когда думаете о потоках. Вы должны открыть свою форму и загрузить все материалы в другой поток. Таким образом ваше приложение реагирует, и он не будет блокировать пользовательский интерфейс. –

+0

Как насчет заставки? Будет ли это работать? –

ответ

1

Я сделал класс Loader некоторое время назад, вы можете использовать. Это показывает окно, делая вашу загрузку-метод, закрывает его после завершения и дает выход методы:

public class Loader<TActionResult>:FrameworkElement 
{ 
    private Func<TActionResult> _execute; 
    public TActionResult Result { get; private set; } 
    public delegate void OnJobFinished(object sender, TActionResult result); 
    public event OnJobFinished JobFinished; 

    public Loader(Func<TActionResult> execute) 
    { 
     if (execute == null) 
      throw new ArgumentNullException("execute"); 

     _execute = execute; 
    } 

    private Window GetWaitWindow() 
    { 
     Window waitWindow = new Window { Height = 100, Width = 200, WindowStartupLocation = WindowStartupLocation.CenterScreen, WindowStyle = WindowStyle.None }; 
     waitWindow.Content = new TextBlock { Text = "Please Wait", FontSize = 30, FontWeight = FontWeights.Bold, HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Center }; 

     return waitWindow; 
    } 

    public void Load(Window waitWindow = null) 
    { 
     if (waitWindow == null) 
     { 
      waitWindow = GetWaitWindow(); 
     } 
     BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += delegate 
     { 
      Dispatcher.BeginInvoke(new Action(delegate { waitWindow.ShowDialog(); })); 
      Result = _execute(); 
      Dispatcher.BeginInvoke(new Action(delegate() { waitWindow.Close(); })); 
     }; 
     worker.RunWorkerCompleted += delegate 
     { 
      worker.Dispose(); 
      if (JobFinished != null) 
      { 
       JobFinished(this, Result); 
      } 
     }; 
     worker.RunWorkerAsync(); 
    } 
} 

Как использовать:

Loader<TResult> loader = new Loader<TResult>(MethodName); 
loader.JobFinished += new Loader<TResult>.OnJobFinished(loader_JobFinished); 
loader.Load(); 

void loader_JobFinished(object sender, TResult result) 
{ 
    // do whatever you want with your result here 
} 
+0

Как передать параметры в метод MethodName? –

2

Вы должны поставить свой трудоёмкий код в фоновом потоке (для этого можно использовать BackgroundWorker, задачу или Async ЖДЕТ, в зависимости от вашей точки чистой рамочным версии)

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    LoadForm lf = new LoadForm(); 
    lf.Visibility = Visibility.Visible; 
    //start the time consuming task in another thread 
} 


HeavyTaskCompleteEvent() 
{ 
    lf.Close(); 
} 

Также обратите внимание на лучший способ, чтобы показать загрузку экран. Вы также можете показать анимацию в главном окне. Я не думаю, что показать форму - это лучший способ.

5

Вы должны посмотреть на статью MSDN по созданию SplashScreen в WPF. По сути, вы добавляете изображение, которое хотите показать в свой проект, и установите «Действие сборки» на «SplashScreen», которое будет отображаться, когда ваша программа запускается и исчезает, когда отображается главное окно приложения.


Вы также можете попробовать импортировать System.ComponentModel класс и использовать BackgroundWorker, чтобы показать вашу Загрузка форму, это позволит вам сохранить отзывчивость вашего пользовательского интерфейса.

public partial class MainWindow : Window 
{ 
    Window1 splash; 
    BackgroundWorker bg; 
    public MainWindow() 
    { 

     InitializeComponent(); 

     bg = new BackgroundWorker(); 
     bg.DoWork += new DoWorkEventHandler(bg_DoWork); 
     bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted); 

    } 

    void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     splash.Hide(); 
    } 

    void bg_DoWork(object sender, DoWorkEventArgs e) 
    { 
     System.Threading.Thread.Sleep(10000); 
    } 


    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     splash = new Window1(); 
     splash.Show(); 
     bg.RunWorkerAsync(); 
    } 
} 
+0

Спасибо, но сначала у меня есть окно для ввода имени пользователя и пароля (загружается быстро), затем, когда в программе проверяется аутентификация, все это загружается, но это полезно для другого моего проекта, у которого нет окна Splash , – FukYouAll

+0

@SteelersMan Посмотрите, помогает ли мое редактирование при использовании 'BackgroundWorker' –

+0

Спасибо, это было очень полезно, поскольку я пытался это сделать, вы помогли два раза. Большое спасибо :) – FukYouAll

Смежные вопросы