Ссылка на кнопку WPF для Winform .dll - PullRequest
0 голосов
/ 07 октября 2019

У меня есть Winform .dll, на которую есть ссылки в моем проекте WPF. Основной метод .dll имеет параметр для передачи объекта Control. Мне нужно передать ссылку на элемент управления WPF Button внутри этого параметра метода, но я получаю ошибку: « Значение типа« Кнопка »не может быть преобразовано в« Управление »".

Я видел, что не могу этого сделать, потому что элементы управления WPF и Winform - это совершенно разные вещи, но я могу что-нибудь сделать?

PS: метод Main .dll открывает окно WinForm рядом с указанным элементом управления (элемент управления WPFв данном случае), поэтому мне нужна ссылка на элемент управления WPF.

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Честно говоря, самое лучшее, простое и чистое решение - сделать еще одну версию метода Main, которая принимает System.Windows.Controls.Control вместо System.Windows.Forms.Control. Они даже могут быть перегружены (имеют одно и то же имя). Изменения в этой новой версии, вероятно, будут очень небольшими и простыми.

Однако, если предположить, что Main - это какой-то огромный, сложный метод, который будет кошмаром даже для взгляда - или у вас нет источникакод больше - и вы действительно должны использовать существующий метод, есть еще одна потенциальная опция:
Создайте класс, который наследуется от System.Windows.Forms.Control, который будет действовать как оболочка вокруг System.Windows.Controls.Control. Вы можете использовать new и / или override ключевые слова, чтобы заменить существующие свойства в System.Windows.Forms.Control, и вместо этого предоставить эквивалентные свойства System.Windows.Controls.Control.

. поспешный пример:

    class WinformsControlWrapper : System.Windows.Forms.Control
    {
        protected System.Windows.Controls.Control WrappedControl;

        public WinformsControlWrapper(System.Windows.Controls.Control wrappedControl)
        {
            WrappedControl = wrappedControl;
        }

        public new int Width
        {
            get { return (int)WrappedControl.Width; }
            set { WrappedControl.Width = value; }
        }
    }

Конечно, есть множество проблем даже с приведенным выше примером: тот факт, что WPF использует double, а winforms использует int, и тот факт, что WPF имеет и Width, иActualWidth чтобы назвать пару. Но вы, вероятно, сможете написать свой класс так, как вам нужно.

Опять же, создание другой версии Main - это гораздо более простое, понятное и, вероятно, более простое решение. Но если вы действительно не можете, вышеуказанная тактика должна сработать.

0 голосов
/ 15 октября 2019

Моим решением было изменить метод Main .dll. Вместо передачи объекта Control я изменил параметр, чтобы принимать объект Point - что мне нужно в конце от элемента управления, чтобы получить их координаты X и Y ... Однако WPF и Winform используют разные ссылки на библиотеки Point (System.Drawing.Pointи System.Point), которые являются разными типами, поэтому при вызове .dll в WPF мне пришлось преобразовать объект WPF Point в тип, который принимает Winform System.Drawing.Point. Это было легче всего, я мог прийти с.

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