Попробовав несколько подходов, в том числе здесь, а также События UIAutomation и ETW для WPF , я решил просто присоединить обработчик к WPF События. Это позволяет мне захватывать не только данные о событиях, но и UIElement, который привлекает внимание пользователей, поэтому намного легче отслеживать действия и намерения пользователя. Без этого мне нужно было бы сделать снимок экрана и определить, что происходит.
Вот пример:
private Int32 _eventCount;
public MainWindow()
{
InitializeComponent();
EventManager.RegisterClassHandler(typeof(UIElement), MouseEnterEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), MouseLeaveEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), MouseMoveEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), MouseUpEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), MouseDownEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), KeyUpEvent, (RoutedEventHandler)handleEvent, true);
EventManager.RegisterClassHandler(typeof(UIElement), KeyDownEvent, (RoutedEventHandler)handleEvent, true);
}
private void handleEvent(object sender, RoutedEventArgs e)
{
var uiElement = e.Source as UIElement;
if (uiElement == null)
{
return;
}
EventStatusDisplay.Text = e.Source + " " + e.RoutedEvent.Name;
EventCountDisplay.Text = (++_eventCount).ToString();
var over = Mouse.DirectlyOver as UIElement;
MouseIsOverDisplay.Text = over == null ? "" : over.ToString();
}
Хотя здесь это не показано, как только я получаю UIElement
, я веду ведение журнала и даже могу затем использовать UIElement.DataContext
, чтобы определить состояние ViewModel, которая управляет представлением, чтобы мы могли найти шаблоны использования во время определенных рабочие процессы и состояния данных, а также визуальные состояния. Затем мы можем получать отчеты по этому вопросу, а также дифференцировать и сравнивать наши тепловые карты по путям через рабочий процесс и значения данных.