如何等待服务完成打开窗口后再处理它

时间:2019-01-22 03:10:54

标签: c# wpf

我有一些代码可以在WPF C#应用程序中使用服务打开一个窗口。打开窗口后,我想创建该窗口的打印屏幕图像文件。问题是我的代码正在创建一个图像文件,该文件的窗口实际打开之前具有该区域的打印屏幕。我试图在ViewOpened事件上创建一个委托,以便它在生成打印屏幕之前一直等到窗口实际打开为止。但是在窗口打开之前,我仍然得到该区域的图像。我该如何解决?

这是我的代码:

    private void M_printScreenButton_Click(object sender, EventArgs e)
    {
        var allViews = SystemConfigurationComponent.GetAllViews();
        foreach (var view in allViews)
        {
            // TODO: Add condition to select which views to process. Maybe add a boolean field to View table.
            if (string.Equals(view.Uri, @"gtcs\gcs\mmc_userpreferences", StringComparison.InvariantCultureIgnoreCase))
            {
                ViewsIntegrationService.OpenMimic(view.Uri, "", "", 2, ThisMimic.Context, null);

                ViewsIntegrationService.ViewOpened += delegate
                {
                    using (Bitmap bitmap = new Bitmap(view.DefaultWidth, view.DefaultHeight))
                    {
                        using (Graphics g = Graphics.FromImage(bitmap))
                        {
                            g.CopyFromScreen(new Point(view.DefaultLeft, view.DefaultTop), Point.Empty,
                                new Size() {Width = view.DefaultWidth, Height = view.DefaultHeight});
                        }
                        bitmap.Save(@"C:\\temp\\GTCS_PrintScreens\\test.jpg", ImageFormat.Jpeg);
                        //bitmap.Save(view.WindowTitle.Replace(" ", string.Empty).Replace("'", string.Empty) + ".jpg", ImageFormat.Jpeg);
                    }

                    //ViewsIntegrationService.CloseView(new AlstomGuiMimicImpl(m_mimicsManager, ThisMimic));
                };
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

看来您是先打开视图,然后在打开后添加事件处理程序。

尝试:

ViewsIntegrationService.ViewOpened += delegate ...

然后

ViewsIntegrationService.OpenMimic(...

另外,Loaded事件可能是更好的屏幕快照。