WPF доступ GUI из другого потока - PullRequest
2 голосов
/ 02 марта 2010

Я работаю над требованием сделать только один экземпляр приложения WPF. Однако я должен передать командную строку первому экземпляру, а затем выполнить какое-либо действие пользовательского интерфейса.

Я использую Mutext для проверки уже запущенных экземпляров, я использую NamedPipes для переноса командной строки в уже запущенный экземпляр.

Но, конечно, я не в нужной теме, чтобы получить доступ к "Window1". Я пытался сохранить ссылку на «Window1» в статическом классе, а затем с помощью Dispatcher вызывать метод в «Window1», однако, как только я пытаюсь получить доступ к переменной (область видимости класса в «Window1»), я получаю a «Ссылка на объект не установлена ​​для экземпляра объекта.»

Действие пользовательского интерфейса заключается в добавлении новой вкладки в TabControl - во время инициализации новой вкладки выполняется некоторая работа - и переменные инициализируются, и даже метод, который я хочу вызвать, работает во время инициализации - но при вызове из Диспетчер не работает.

Любые подсказки, как это сделать? Я здесь не на том пути?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 02 марта 2010

Это просто:

void ProcessCommandLine(string commandLine)
{
  Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() =>
  {
    ... code to process the command line here ...
  });
}

Вы можете вызвать это из вашего App.Startup, а также из вашего потока, который получает сообщения из именованного канала.

Ключевые соображения здесь:

  1. Использование BeginInvoke вместо Invoke для предотвращения ожидания вызывающим потоком
  2. Использование DispatcherPriority.ApplicationIdle, чтобы гарантировать, что приложение завершило инициализацию до обработки командной строки
  3. Использование Application.Current.Dispatcher вместо Window1.Dispatcher в случае, если Window1 еще не инициализирован
2 голосов
/ 02 марта 2010

Это не правильно, вы уверены, что мьютекс правильно передает управление вашему запущенному экземпляру приложения?

Если это была проблема с доступом к пользовательскому интерфейсу потока, вы должны были получить эту ошибку: вызывающий поток не может получить доступ к этому объекту, поскольку другой поток принадлежит ему.

Тот факт, что вы получаете «Ссылка на объект не установлена ​​на экземпляр объекта». сообщение об ошибке означает, что вы еще не создали объект как новый.

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