Откройте новую Windows из фоновой темы на ViewModel - PullRequest
2 голосов
/ 18 ноября 2011

Итак, у меня есть приложение WPF (MVVM) с заставкой.При запуске заставки у меня есть фоновая нить в ViewModel, которая выполняет некоторые действия, связанные с запуском.В некоторых случаях я хочу открыть пару дополнительных окон (требуется пользовательский ввод и т. Д.).Я получал ряд проблем / ошибок / исключений при попытке сделать это (в основном вокруг этого нового окна - также MVVM - при попытке заполнить его элементы пользовательского интерфейса, такие как поля со списком).Итак, я вернул проблему к более простой форме - у «tempWindow» ничего нет, поэтому он не выдает ошибки заполнения пользовательского интерфейса, но в основном он просто открывает их, и как только фоновый поток завершается, закрывает их все,Если бы кто-то мог указать мне правильное направление на то, что я делаю неправильно, это было бы оценено.

Конструктор для ViewModel запускает фоновый поток

public SplashScreenViewModel()
{            
   this.LoadingStatusText = "Starting Startup Processing ... ";
   this.VersionNumber = "version " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();

   var threadBackgroundStartUpProcesses = new Thread(new ThreadStart(this.BackgroundStartUpProcesses));
   threadBackgroundStartUpProcesses.SetApartmentState(ApartmentState.STA);
   threadBackgroundStartUpProcesses.IsBackground = true;
   threadBackgroundStartUpProcesses.Start();
}

Фоновый поток,следует просто открыть три окна (что и происходит), но эти окна должны оставаться открытыми (они исчезают после завершения потока).

private void BackgroundStartUpProcesses()
{
    for (int i = 0; i < 3; i++)
    {
        var objTempWindow = new tempWindow();
        objTempWindow.Show();
    }
}

// РЕДАКТИРОВАТЬ: обновляется с ответами, теперь появляется ошибка, когда TempWindow имеетcomboBox, который заполняется из TempWindowViewModel.

private void BackgroundStartUpProcesses()
{
    for (int i = 0; i < 3; i++)
    {
        var objTempWindow = new tempWindow();
        objTempWindow.Show();
    }

    System.Windows.Threading.Dispatcher.Run();
}

При открытии TempWindow возникает исключение: «Вызывающий поток не может получить доступ к этому объекту, поскольку его принадлежит другой поток».выдается и появляется, когда ComboBox в этом окне пытается заполниться.

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Я подозреваю, что окнам нужен владелец, и когда владелец умирает, окно тоже. Открытие окон на главной нити заставляет их держаться. Как то так ...

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        var threadBackgroundStartUpProcesses = new Thread(new ParameterizedThreadStart(this.BackgroundStartUpProcesses));
        threadBackgroundStartUpProcesses.SetApartmentState(ApartmentState.STA);
        threadBackgroundStartUpProcesses.IsBackground = true;
        threadBackgroundStartUpProcesses.Start(System.Windows.Threading.Dispatcher.CurrentDispatcher);
    }

    private void BackgroundStartUpProcesses(object d)
    {
        System.Windows.Threading.Dispatcher dispatcher = (System.Windows.Threading.Dispatcher) d;
         for (int i = 0; i < 3; i++)
         {
             dispatcher.BeginInvoke((Action)(() =>
             {
                 var objTempWindow = new tempWindow();
                 objTempWindow.Show();

             }));

         }

    }
}

редактировать

Я только что покопался в потоке WPF и похоже, что вы можете открывать окна в нескольких потоках, но вам нужно запустить новый диспетчер. Смотрите в конце этой страницы:

http://msdn.microsoft.com/en-us/library/ms741870.aspx

В вашем BackgroundStartupProcesses, под objTempWindow.Show() добавьте эту строку

System.Windows.Threading.Dispatcher.Run();
0 голосов
/ 18 ноября 2011

Вы устанавливаете MainWindow перед закрытием заставки?WPF устанавливает первое открытое окно приложения как MainWindow, и если вы не изменили ShutdownMode вашего App.xaml, то после закрытия заставки приложение закрывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...