WPF Visibility. Visible не работает при запуске внешнего приложения с помощью кнопки WPF; - PullRequest
0 голосов
/ 13 июля 2011

У меня есть следующий код для запуска внешнего приложения. Когда я нажимаю кнопку, мне нужно сделать так, чтобы страница была серой, чтобы я сделал прямоугольник уже на странице видимым и полноэкранным.

    private void uxOfficeApps_Click(object sender, RoutedEventArgs e)
    {
        Rectangle rect = FindChild<Rectangle>(ParentWindow, "rectangle1");
        rect.Height = _basePage.SCREEN_RESOLUTION_HEIGHT;
        rect.Width = _basePage.SCREEN_RESOLUTION_WIDTH;
        rect.Visibility = Visibility.Visible;

        string executablePath = _basePage.PATH_OFFICE;
        executable = new Process();
        executable.StartInfo.FileName = executablePath;
        executable.Start();
        executable.EnableRaisingEvents = true;
        executable.Exited += new EventHandler(officeApps_Exited);
        executable.WaitForExit();
   }

Работает нормально, и приложение ждет и возвращает, когда мое внешнее приложение закрыто, однако прямоугольник отображается только при выполнении завершенного события officeApp_Exited, а не до того, как оно было загружено, как мне хотелось бы. (экран не обновляется)

событие выхода -

void officeApps_Exited(object sender, EventArgs e)
{
        MessageBox.Show("I am back");
        // do further processing
}

Видимость не работает.

Однако это работает, когда я помещаю MessageBox.Show («Предупреждение») между отображением прямоугольника и созданием объекта процесса.

Кто-нибудь знает почему ??? Пожалуйста, помогите

Ответы [ 3 ]

2 голосов
/ 13 июля 2011

Попробуйте обернуть ваш код в Dispatcher.BeginInvoke. Это должно дать UI достаточно времени для перерисовки, прежде чем вы начнете свой процесс

    Dispatcher.BeginInvoke(new Action(() =>
    {
        string executablePath = _basePage.PATH_OFFICE;
        executable = new Process();
        executable.StartInfo.FileName = executablePath;
        executable.Start();
        executable.EnableRaisingEvents = true;
        executable.Exited += new EventHandler(officeApps_Exited);
        executable.WaitForExit();
    }), DispatcherPriority.ApplicationIdle);
1 голос
/ 13 июля 2011

Поскольку вы запрашиваете приложение, чтобы пользовательский поток WaitForExit () зависал для этой операции .... поэтому видимость прямоугольника не будет показывать никакого эффекта, пока процесс не завершится ...

Используйте следующий код ...

 new TaskFactory().StartNew(() =>
            {
 string executablePath = _basePage.PATH_OFFICE;
        executable = new Process();
        executable.StartInfo.FileName = executablePath;
        executable.Start();
        executable.EnableRaisingEvents = true;
        executable.Exited += new EventHandler(officeApps_Exited);
        executable.WaitForExit();
  });

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

void officeApps_Exited(object sender, EventArgs e)
{
System.Windows.Application.Current.Dispatcher.BeginInvoke((Action)delegate()
                 {
        MessageBox.Show("I am back");
        // do further processing
 });
}

Что бы вы ни делали в "officeApps_Exited", переместите это в // дальнейшую обработку.

0 голосов
/ 13 июля 2011

Я подозреваю, что ваша проблема в том, что вызов WaitForExit () блокирует поток пользовательского интерфейса и поэтому не позволяет визуализировать изменение видимости. Я не уверен, почему установка MessageBox помогает, может быть, что-то, связанное с модальным рендерингом, заставляет его перекрашивать окно перед открытием диалога. Попробуйте запустить код запуска процесса в BackgroundWorker, а затем выполнить код в обработчике события Exited с помощью Dispatcher.Invoke () обратно в поток пользовательского интерфейса.

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