将 WPF 按钮引用到 Winform .dll

Reference WPF button to Winform .dll

我的 WPF 项目中引用了一个 Winform .dll。 .dll 的 Main 方法有一个用于传递 Control 对象的参数。我需要在该方法参数内传递 WPF 按钮控件的引用,但我收到错误:“ 类型 'Button' 的值无法转换为 'Control'”。

据我所知,我不能这样做,因为 WPF 和 Winform 控件是完全不同的东西,但是有什么我可以做的吗?

P.S.: Main .dll 方法打开指定控件(在本例中为 WPF 控件)旁边的 WinForm window,这就是为什么我需要 WPF 控件的引用。

老实说,最好、最简单、最干净的解决方案是制作另一个版本的 Main 方法,它接受 System.Windows.Controls.Control 而不是 System.Windows.Forms.Control。它们甚至可以超载(共享相同的名称)。这个新版本的变化可能会很少而且很简单。

但是,假设 Main 是一个巨大而复杂的方法,即使看一眼也是一场噩梦-或者您不再拥有源代码-而您 真的 必须使用现有方法,还有另一种可能的选择:
制作一个继承自 System.Windows.Forms.Control 的 class,它将充当 System.Windows.Controls.Control 的包装器。您可以使用 new and/or 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 同时具有 WidthActualWidth 举出一对。但是你应该能够编写你的 class 来按照你需要的方式工作。

同样,制作另一个版本的 Main 是一个更简单、更清晰且可能更容易的解决方案。但是如果你真的不能,上面的策略应该有效。

我的解决方案是更改 Main .dll 方法。我没有传递 Control 对象,而是更改了参数以接受 Point 对象——这是我最终需要从控件获取它们的 X 和 Y 坐标的对象……但是 WPF 和 Winform 使用不同的 Point 库引用(System.Drawing.Point和 System.Point) 它们是不同的类型,因此在 WPF 中调用 .dll 时,我必须将 WPF Point 对象转换为 Winform System.Drawing.Point 接受的类型。这是我能想到的最简单的方法。