WPF Visibility.从WPF按钮执行外部应用程序时,Visible不起作用

本文关键字:WPF Visible 不起作用 应用程序 外部 Visibility 按钮 执行 | 更新日期: 2023-09-27 18:01:52

我有以下代码来启动外部应用程序。当我点击按钮时,我需要使页面变灰,这样我就可以在页面上看到一个矩形并全屏显示。

    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("Alert"(时,它确实有效。

有人知道为什么吗???请帮助

WPF Visibility.从WPF按钮执行外部应用程序时,Visible不起作用

尝试将代码包装在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);

由于您要求应用程序执行WaitForExit((,因此该操作的ui线程挂起。。。。所以矩形可见性在进程退出之前不会显示任何效果。。。

使用以下代码。。。

 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();
  });

在上面的代码中,我在一个新任务中运行进程(就像后台一样(。。。。因此UI线程不会挂起等待进程退出。。。。

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"中做什么,都会将其移动到//进行进一步处理。

我怀疑您的问题是调用WaitForExit((会阻塞UI线程,从而阻止呈现可见性更改。我不知道为什么设置MessageBox有帮助,也许是与模式渲染有关的事情导致它在设置对话框之前重新绘制窗口。请尝试在BackgroundWorker中运行进程启动代码,然后使用Dispatcher.Invoke((将Exited事件处理程序中的代码执行回UI线程。