FlywheelJack Ответов: 1

Я неправильно понимаю события в C# WPF?


Я работаю над приложением в WPF, используя принтер с SDK, который говорит, что у него есть событие StatusUpdate. До сих пор я не могу получить статус, чтобы вернуться, даже когда я выполняю действие, которое, как я знаю, должно вызвать его.

Я использовал этот код в приложении windows forms, и он работает так, как должен.
Я подозреваю, что есть проблема с кодированием его в WPF с использованием дизайна MVVM. Я попытался поместить код обработчика событий в код MainView позади, а затем в MainViewModel. Я создал отдельный clss, чтобы посмотреть, смогу ли я заставить его стрелять и оттуда.

Есть ли у кого-нибудь предложения о том, что я мог бы сделать с событиями, которые будут запускаться в WPF?

Или я упускаю что-то еще о событиях?

Что я уже пробовал:

Я попытался поместить код обработчика событий в код MainView позади, а затем в MainViewModel. Я создал отдельный clss, чтобы посмотреть, смогу ли я заставить его стрелять и оттуда.

Foothill

Можете ли вы указать, какой тип события вы пытаетесь вызвать? WPF имеет два различных типа событий, которые можно свободно называть сверху вниз (использует EventArgs) и снизу вверх (использует RoutedEventArgs). События сверху вниз, такие как MouseDown, поднимаются из слоя view, но события снизу вверх поднимаются из слоя Dispacher (Windows Message Pump), например PreviewMouseDown.

FlywheelJack

Я не мог начать догадываться, но я могу попробовать :D
Приложение использует Microsoft.PointOfService для получения информации о принтере и т. д. и реализует свой собственный StatusUpdateEventHandler для обработки событий. Это почти похоже на сценарий "снизу вверх", поскольку он отслеживает события состояния, которые не обязательно запускаются Пользователем в пользовательском интерфейсе.

Foothill

Потребовалась минута, чтобы найти, но ваше событие статуса вызывается прикладным уровнем. Например, OnStatusChanged += HandleStatusChange; где подпись обработчика-HandleStatusChange(Object sender, StatusUpdateEventArgs e) {//do something }

FlywheelJack

В течение дня я пробовал разные способы;
в основном они выглядят так,

охраняемых недействительными AddStatusUpdateEvent(объект-источник события)
{
Метод eventinfo statusUpdateEvent = источник события.метод GetType().Помощью Getevent("StatusUpdateEvent");
if (statusUpdateEvent != null)
{
statusUpdateEvent.AddEventHandler(eventSource, new StatusUpdateEventHandler (OnStatusUpdateEvent));
}
}


FlywheelJack

Сейчас придется уйти, завтра попробую еще раз, спасибо за помощь.

Foothill

Быстрый вопрос: вы пытаетесь реагировать на события, исходящие от принтера?

FlywheelJack

Обновления состояния поступают с принтера, но через объект, созданный библиотекой точек обслуживания Microsoft. Таким образом, создается объект обслуживания, который затем отслеживает и сообщает Все, что связано с принтером (принтер точки обслуживания-это тот, который может печатать квитанции, обрабатывать чеки и т. д.)

Philippe Mori

Я никогда не видел такого кода. Что должен делать этот код?

1 Ответов

Рейтинг:
1

Foothill

Чтобы прослушивать события с принтера, вам нужно работать в системе событий.
Учитывая мое незнание этой части .Net, я могу получить вас только в пределах стадиона.

using Microsoft.PointOfService;

namespace EventHandlers
{
  public class PrinterEventHandler
  {
    private PosPrinter _printer;

    public PrinterEventHandler(PosPrinter printer)
    {
      _printer = printer;
      _printer.OnStatusUpdate += HandleStatusUpdate;  // Add a listener function.  OnStatusUpdate should be a function that when called which raises that status updated event
    }

    public void HandleStatusUpdate(object sender, StatusUpdateEventArgs e)
    {
      // Respond to event...
    }
  }
}