Как ждать, пока сервис завершит открытие окна, прежде чем его обрабатывать - PullRequest
0 голосов
/ 22 января 2019

У меня есть код, который открывает окно с помощью службы в моем приложении 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 голосов
/ 22 января 2019

Похоже, вы сначала открываете представление, а затем добавляете обработчик событий после его открытия.

Попробуйте:

ViewsIntegrationService.ViewOpened += delegate ...

Затем

ViewsIntegrationService.OpenMimic(...

Дополнительно,Loaded событие, вероятно, лучше использовать для создания снимка экрана.

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