Как дождаться завершения потока рендеринга в WPF?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как дождаться завершения потока рендеринга в WPF?

Сообщение Anonymous »

У меня есть такой сценарий: я использовал Caliburn.micro в качестве платформы MVVM на платформе .NET 6.
Мне нужно вставить блок в пользовательский интерфейс, когда пользователь нажимает кнопку «Добавить». кнопку и сделайте снимок экрана «новейшего» пользовательского интерфейса.
Разметка пользовательского интерфейса: VM

Код: Выделить всё

using Caliburn.Micro;
using ShadowBot.UIAutomation.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace WpfApp1
{
public class MainWindowContext : Screen
{
public BindableCollection Blocks { get; set; } = new BindableCollection();

public MainWindowContext()
{
Blocks.Add(new Block() { Text = DateTime.Now.ToString() });
}

public void Add()
{
Blocks.Add(new Block() { Text = DateTime.Now.ToString() });
NotifyOfPropertyChange(nameof(Blocks));

Application.Current.Dispatcher.Invoke(() =>
{
using (var bitmap = SnippingTool.Screenshots())
{
bitmap.Save("D:\\Desktop\\temp\\test.png", System.Drawing.Imaging.ImageFormat.Png);
}
});
}

public void Remove()
{
if (Blocks.Count > 0)
{
Blocks.RemoveAt(Blocks.Count - 1);
NotifyOfPropertyChange(nameof(Blocks));
}
}
}

public class Block : PropertyChangedBase
{
private string _text;

public string Text
{
get =>  _text;
set
{
_text = value;
NotifyOfPropertyChange(nameof(Text));
}
}
}
}
Проблема: новый блок вставлен в BindableCollection, но его рендеринг еще не завершен, когда я делаю снимок экрана.
Что я пробовал
  • Измените метод Invoke на BeginInvoke, но это работает не работает
  • Измените DispatcherPriority в ContextIdle, это работает.

    Код: Выделить всё

    Application.Current.Dispatcher.BeginInvoke(() =>
    {
    using (var bitmap = SnippingTool.Screenshots())
    {
    bitmap.Save("D:\\Desktop\\temp\\test.png", System.Drawing.Imaging.ImageFormat.Png);
    }
    }, System.Windows.Threading.DispatcherPriority.ContextIdle);
    
    Но приоритет ContextIdle слишком низок, я беспокоюсь, что это вызовет еще больше серьезных ошибок в моей программе, потому что я сделал много важных вещей, помимо создания моментального снимка.
Итак, есть ли какое-либо событие или обратный вызов в WPF, чтобы уведомить меня после завершения рендеринга элемента?


Подробнее здесь: https://stackoverflow.com/questions/793 ... hed-in-wpf
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как дождаться завершения потока рендеринга в WPF?
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как дождаться завершения потока рендеринга в WPF?
    Anonymous » » в форуме C#
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Как правильно дождаться завершения при разветвлении конвейера потока данных TPL? [дубликат]
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как дождаться полного завершения процесса повторной синхронизации RAID-массива mdadm?
    Anonymous » » в форуме Linux
    0 Ответы
    72 Просмотры
    Последнее сообщение Anonymous
  • Как дождаться завершения загрузки с помощью Webdriver
    Anonymous » » в форуме JAVA
    0 Ответы
    57 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»