将Form转换为UserControl

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将Form转换为UserControl相关的知识,希望对你有一定的参考价值。

我有一个我正在使用的第三方代码库;此库的一部分是一个winforms应用程序,用于编辑此库使用的配置文件。我想将他们的配置编辑器应用程序嵌入到我的应用程序中。

我有他们的库的源代码和配置编辑器(据我所知)使用标准控件的直接Winforms应用程序。我正在尝试将应用程序的主窗体转换为UserControl,以便我可以在我的应用程序中托管它,这是WPF(WPF的WindowsFormsHost不会托管Form对象,我得到一个例外)。

我将表单对象更改为继承UserControl而不是Form并修复了所有编译器错误(没有很多,只是在UserControls上不存在的属性初始化)但是发生的事情是我新转换的控件只是空白。

当我运行我的测试应用程序时,我没有看到构成原始表单的任何控件,只是一个空白页面。

有任何想法吗?我真的不想从头开始重新实现他们的应用程序,这会很糟糕。

编辑:我忘了提到我在WinForms应用程序中测试它,而不是WPF,只是在尝试从WPF使用它之前让控件正常工作。

答案

显然,InitializeComponent()方法不再正常运行。当然不确定为什么。

也许更好的方法是在控件中转换表单:

  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      var f2 = new Form2();
      f2.TopLevel = false;
      f2.Location = new Point(5, 5);
      f2.FormBorderStyle = FormBorderStyle.None;
      f2.Visible = true;
      this.Controls.Add(f2);
    }
  }
另一答案

我不知道为什么,但他们的InitializeComponent()方法基本上将所有控件Visible属性设置为False。我想它必须使用一些表单启动事件将它们更改为可见,不会被调用为UserControl,将其可见性设置回true,修复它。

另一答案

我遇到了类似的问题,只缺少InitializeComponent中的addig控件。像这样

  this.Controls.Add(this.button1);
  this.Controls.Add(this.button2);
另一答案

只要你在设计器代码中修改任何对Form类的引用(注释掉你需要回滚),只需将类声明从:Form更改为:UserControl。必须删除任何特定于表单的事件处理程序。我一直在用几种形式做这个,它的工作得很好。

以上是关于将Form转换为UserControl的主要内容,如果未能解决你的问题,请参考以下文章

将ObjectHandle转换为UserControl

将图片从usercontrol传递到Form

通过 ElementHost 将 WPF 应用程序转换为 UserControl 以在 WinForms 应用程序中使用

C# 重写UserControl和Form的CreateParams方法。。。求详解,并给下面的代码加详细注释。。。谢谢。。。

C# 做的winform窗体程序把一个Form给为自定义控件?

HTML Bookmarklet模板:将任何JavaScript代码片段转换为Bookmarklet