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

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

Сообщение Anonymous »

У меня есть такой сценарий, я использовал Calibur.mico в качестве инфраструктуры mvvm на платформе .net6:
Мне нужно вставить блок в пользовательский интерфейс, когда пользователь нажимает кнопку «Добавить», и сделать снимок экрана « новейший" пользовательский интерфейс.
Код пользовательского интерфейса




































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, но его рендеринг еще не завершен, когда я делаю снимок экрана
Что я пробовал
  • Измените метод Ivoke на 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);

But the **ContextIdle priority is too low**,i worry about it will cause more hard bugs into my program,bucause i did many important things besides of take snapShot.

**So,Is there any event or a callback in WPF to notify me after a Element finished rendering?**


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

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

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

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

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

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

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