C# 将WPF按钮引用到Winform.dll

C# 将WPF按钮引用到Winform.dll,c#,wpf,winforms,controls,C#,Wpf,Winforms,Controls,我在WPF项目中引用了一个Winform.dll。.dll的Main方法有一个用于传递控制对象的参数。我需要在该方法参数内传递WPF Button控件的引用,但收到错误:“Button”类型的值无法转换为“control” 据我所知,我不能这样做,因为WPF和Winform控件是完全不同的东西,但有什么我可以做的吗 注意:Main.dll方法在本例中打开指定控件WPF控件旁边的WinForm窗口,这就是为什么我需要引用WPF控件。老实说,最好、最简单、最干净的解决方案是制作另一个版本的Main方

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

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


注意:Main.dll方法在本例中打开指定控件WPF控件旁边的WinForm窗口,这就是为什么我需要引用WPF控件。

老实说,最好、最简单、最干净的解决方案是制作另一个版本的Main方法,它接受System.Windows.Controls.control,而不是System.Windows.Forms.control。它们甚至可以使用相同的名称重载。对这个新版本的更改可能很少,也很简单

然而,假设Main是一个巨大而复杂的方法,甚至连看都看不清楚——或者你已经没有源代码了——并且你真的必须使用现有的方法,那么还有一个潜在的选择: 创建一个从System.Windows.Forms.Control继承的类,该类将充当System.Windows.Controls.Control的包装器。您可以使用和/或关键字替换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是一个更简单、更干净、可能更容易的解决方案。但是如果你真的不能,上面的策略应该会起作用。

我的解决方案是改变Main.dll方法。我没有传递控制对象,而是将参数改为接受点对象,这是我最终需要从控制对象获得的X和Y坐标。。。但是,WPF和Winform使用不同的点库引用System.Drawing.Point和System.Point,它们是不同的类型,因此在WPF中调用.dll时,我必须将WPF点对象转换为Winform System.Drawing.Point接受的类型。那是我能带的最简单的

您可以使用WPF中的上下文菜单实现相同的功能。也许试着解释一下这个DLL的作用,这样我们就可以提供帮助了。使用该DLL打开的窗口中有什么?@denischaf.DLL只是一个带有文本框的简单Winform窗口。当我在文本框中输入值时,有些东西保存在DB中。但这和WPF项目是完全不同的…我的问题是.dll方法包含控件参数,这确保Winform窗口在我想要的地方打开。你有dll的代码吗,这样你就可以添加一个新的函数调用或与WPF控件一起工作的构造函数?@DenisSchaf,不,我没有,我对WPF比较陌生,所以这就是我问的原因。我应该使用什么样的类声明来制作这个或任何示例?感谢您的回答和示例。结果我遇到了一些严重的问题,所以我决定按照您的建议编写一个新的Main方法。稍后将发布答案。