Отображение событий WPF на события Windows Forms - PullRequest
2 голосов
/ 22 декабря 2011

У меня сложная система, для которой нужны события Winform. Однако я хочу добавить к нему элементы WPF. Поэтому мне нужно сопоставить все события WPF с их аналогами winform. Например. У меня есть этот метод, который преобразует событие MouseMove в мой производный класс ElementHost.

    private void Child_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
    {
        Point point = e.GetPosition(null);
        System.Windows.Forms.MouseEventArgs eventArgs = 
            new System.Windows.Forms.MouseEventArgs 
                (System.Windows.Forms.MouseButtons.Left, 0, (int)point.X, (int)point.Y, 0);
        OnMouseMove(eventArgs);
    }

Обратите внимание на разницу между System.Windows.Input.MouseEventArgs (WPF) и System.Windows.Forms.MouseEventArgs (Winforms).

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

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

К сожалению, я согласен с Gaz, что нет простого способа сделать это автоматически.

Единственное, что я могу порекомендовать, чтобы облегчить переход, - это создать какой-то общий метод расширения для всего, например ToWinformsEvent.Преимущество этого заключается в том, что многие элементы управления будут использовать одни и те же дочерние параметры, и, внедряя стандартный метод расширения, вы можете несколько бессмысленно преобразовать многие параметры (например, преобразование точки в MouseEventArgs, вероятно, будет использоваться во многихваши функции)

1 голос
/ 22 декабря 2011

Согласитесь с другими постерами, это можно сделать только вручную. Однако можно аккуратно свернуть код, чтобы реализовать его только один раз.

Чтобы справиться с этим в недавнем проекте, я создал вспомогательный класс MouseManager. У MouseManager были такие методы:

void Subscribe(IPublisWpfEvents publisher, ISinkMouseEvents target);
void Subscribe(IPublishWinformsEvents publisher, ISinkMouseEvents target)
void Unsubscribe(IPublisWpfEvents publisher);
void Unsubscribe(IPublishWinformsEvents publisher);

Для пользовательских контролей WPF я бы реализовал IPublishWpfEvents, а для пользовательских контролей Winforms я бы реализовал IPublisWinFormsEvents. Два интерфейса будут иметь точные подписи для событий встроенной мыши, поэтому никакой имплементации на самом деле не нужно, просто прикрепите интерфейс к своему пользовательскому контролю и все.

Наконец, MouseManager связывает события между издателями (двух разных типов) и подписчиками (одного типа). Мне пришлось создать свои собственные унифицированные MouseArgs, которые имели свои собственные перечисления, такие как MouseButton и класс MousePoint.

Приятным побочным продуктом этого стало то, что у меня теперь есть интерфейсы для обработки всех моих событий мыши, то есть я могу выполнять модульный тест публикации и обработки событий, используя RhinoMocks или аналогичные.

Надеюсь, это поможет,

1 голос
/ 22 декабря 2011

Нет, автоматически сделать это невозможно, поскольку WPF и формы имеют разные аргументы и события и запускают их при разных обстоятельствах.Вы пытаетесь жениться на двух разных вещах, и я подозреваю, что вы находитесь на пути к кошмару.

Чего вы пытаетесь достичь?Я предполагаю какую-то графическую абстракцию?Ваша абстракция, вероятно, будет лучше перенесена дальше в код и позволит графическим интерфейсам работать так, как они хотят.

РЕДАКТИРОВАТЬ: ОК, из ваших изменений вы видите, что реализуете фасад над элементами управления WPF, чтобы позволитьработать в вашей среде форм.Не вижу другого выхода, кроме как делать это вручную.Вы действительно должны использовать элементы управления WPF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...