Мне нужно вставить блок в пользовательский интерфейс, когда пользователь нажимает кнопку «Добавить». кнопку и сделайте снимок экрана «новейшего» пользовательского интерфейса.
Разметка пользовательского интерфейса:
Код: Выделить всё
Код: Выделить всё
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));
}
}
}
}
Что я пробовал
- Измените метод Invoke на BeginInvoke, но это работает не работает
- Измените DispatcherPriority в ContextIdle, это работает.
Но приоритет 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);
Подробнее здесь: https://stackoverflow.com/questions/793 ... hed-in-wpf