将表单转换为用户控件

4
我有一个第三方代码库,正在使用其中的一部分,这个库中有一个用于编辑此库使用的配置文件的WinForms应用程序。我想将他们的配置编辑器应用程序嵌入到我的应用程序中。
我拥有他们库的源代码,配置编辑器是(据我所知)一个使用标准控件的直接Winforms应用程序。我试图将应用程序的主窗体转换为UserControl,以便我可以在我的WPF应用程序中托管它(WPF的WindowsFormsHost无法托管Form对象,我会收到异常)。
我将Form对象更改为继承自UserControl,并修复了所有编译器错误(没有很多,只是对UserControls不存在的属性初始化),但是我的新转换控件只是空白的。
当我运行我的测试应用程序时,我看不到组成原始表单的任何控件,只有一个空白页面。
有什么想法吗?我真的不想从头开始重新实现他们的应用程序,那样会很糟糕。
编辑:我忘记提到我在WinForms应用程序中进行测试,而不是WPF,只是为了让控件正常工作,然后再尝试从WPF中使用它。
4个回答

6

很明显,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);
    }
  }

1

我不知道为什么,但是他们的InitializeComponent()方法基本上将所有控件的Visible属性设置为False。我猜它可能使用了一些启动事件来将它们更改为可见,但作为一个UserControl,这个事件没有被调用,将它们的可见性重新设置为true就解决了问题。


1
当您最初在设计器中打开表单(在将其转换为用户控件之前),是否看到所有的控件? - MusiGenesis

0

我曾经遇到过类似的问题,只是在InitializeComponent中添加控件而已。

  this.Controls.Add(this.button1);
  this.Controls.Add(this.button2);

0
只要您在设计师代码中修复对Form类的任何引用(如果需要回滚,请注释掉),只需将类声明从:Form更改为:UserControl即可。任何特定于表单的事件处理程序都必须被删除。我已经用这种方法处理了几个表单,效果非常好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接