从WPF中托管的WinForms控件创建表单 – 未设置所有者
脚本
我有以下场景(我已将其剥离为示例应用程序):
- 带有窗口( MainWindow )的WPF应用程序,托管WinForms UserControl( UserControl1 )。
- 该控件在后面的代码中动态添加到
WindowsFormsHost
- 该控件在后面的代码中动态添加到
- UserControl1有一个打开表单的按钮( Form1 )
- 它使用
form1.Show(this)
。
- 它使用
问题是:
- Form1的
.Owner
属性为null。- 在实际应用程序中,有些工作涉及
.Owner
属性,这意味着我不能忽略这个问题。 当然,理想情况下,这里没有任何依赖性。 - 在实际应用程序中,我无法控制此代码的WinForms端。 我们的WPF应用程序正在托管另一个团队的WinForms控件。
- 笔记:
- 当我使用WinForms主机时,
.Owner
属性设置正确。 - UserControl1以其他所有方式托管 – 在实际应用程序中,其他一切工作正常,只是由用户控件打开的表单没有合适的所有者。
- 当我使用WinForms主机时,
- 在实际应用程序中,有些工作涉及
我能理解为什么这里有问题,但我希望我的下一个问题的答案可能是’是’!
有什么方法可以通过在等式的WPF方面进行更改来实现这一点吗?
如果做不到,可以在WinForms方面做任何事情吗? (这可能超出了我可以在那里实现一些变化的可能性……)
示例代码
这是我的示例应用程序中的代码。 首先是WPF方面:
public partial class MainWindow : Window { private WindowsFormsHost host; public MainWindow() { InitializeComponent(); } private void btnAdd_Click(object sender, RoutedEventArgs e) { UserControl1 uc1 = new UserControl1(); WindowsFormsHost.EnableWindowsFormsInterop(); this.host.Child = uc1; } }
现在WinForms方面……
UserControl1只是一个用户控件,上面有一个按钮和一个标签。 这是代码:
public partial class UserControl1 : UserControl { public UserControl1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form1 form1 = new Form1(); form1.Show(this); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.label1.Text = "this: " + this + Environment.NewLine + "parent: " + this.Parent + Environment.NewLine + "toplevelcontrol: " + this.TopLevelControl; } }
Form1只是一个空表单。
public partial class Form1 : Form { public Form1() { InitializeComponent(); } protected override void OnLoad(EventArgs e) { base.OnLoad(e); MessageBox.Show(" this: " + this + " owner: " + this.Owner); } }
在WPF中托管时,消息框中显示的Owner
和标签中显示的TopLevelControl
为null
,但在另一个WinForms应用程序中托管时具有值。
进一步的调查
我想这里的问题是.Owner
是Form
类型,并且在WPF应用程序中没有这种类型的实例。 很难想象财产在这种情况下可能具有的有效价值。 因此,似乎我需要更改代码,以便访问Form1中的`.Owner’属性。
MapControlinheritanceSystem.Windows.Forms.Control
MapHost.Child = MapControl;