C# 从WPF中托管的WinForms控件创建表单--未设置所有者 脚本

C# 从WPF中托管的WinForms控件创建表单--未设置所有者 脚本,c#,wpf,winforms,winforms-interop,C#,Wpf,Winforms,Winforms Interop,我有以下场景(我已将其拆分为一个示例应用程序): 一个WPF应用程序,其窗口(MainWindow)承载WinForms UserControl(UserControl1)。 控件动态添加到WindowsFormsHost UserControl1有一个打开表单的按钮(Form1) 它使用格式1.显示(此) 问题是: Form1的。所有者属性为空。 在实际应用程序中,一些工作涉及.Owner属性,这意味着我不能忽略这个问题。当然,在理想情况下,这里不会有任何依赖性 在实际应用程序

我有以下场景(我已将其拆分为一个示例应用程序):

  • 一个WPF应用程序,其窗口(MainWindow)承载WinForms UserControl(UserControl1)。
    • 控件动态添加到
      WindowsFormsHost
  • UserControl1有一个打开表单的按钮(Form1
    • 它使用
      格式1.显示(此)
问题是:

  • Form1
    。所有者
    属性为空。
    • 在实际应用程序中,一些工作涉及
      .Owner
      属性,这意味着我不能忽略这个问题。当然,在理想情况下,这里不会有任何依赖性
    • 在实际应用程序中,我无法控制代码的WinForms端。我们的WPF应用程序正在托管另一个团队的WinForms控件
    • 注:
      • 当我改用WinForms主机时,
        .Owner
        属性设置正确
      • UserControl1在所有其他方面都可以很好地托管——在实际应用程序中,其他一切都可以很好地工作,只是用户控件打开的表单没有合适的所有者
我能理解为什么这里有问题,但我希望我下一个问题的答案可能是“是”

我可以通过对等式的WPF端进行更改来实现这一点吗?

如果做不到这一点,WinForms方面可以做些什么吗?(我可以在那里实施一些更改,这并不超出可能性范围…)

示例代码 下面是我的示例应用程序中的代码。首先,WPF方面:


公共部分类主窗口:窗口
{
私有WindowsFormsHost主机;
公共主窗口()
{
初始化组件();
}
私有无效btnAdd_单击(对象发送者,路由目标e)
{
UserControl1 uc1=新的UserControl1();
WindowsFormsHost.启用windowsformsinterop();
this.host.Child=uc1;
}
}
现在WinForms方面

UserControl1只是一个带有按钮和标签的用户控件。代码如下:

公共部分类UserControl1:UserControl
{
公共用户控制1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
Form1 Form1=新Form1();
表1.展示(本);
}
受保护的覆盖无效加载(事件参数e)
{
基础荷载(e);
this.label1.Text=“this:+this+Environment.NewLine+”父级:“+this.parent+Environment.NewLine+”toplevelcontrol:”+this.toplevelcontrol;
}
}
表单1只是一个空表单

公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
受保护的覆盖无效加载(事件参数e)
{
基础荷载(e);
MessageBox.Show(“this:+this+”所有者:+this.owner);
}
}
消息框中显示的
Owner
和标签中显示的
TopLevelControl
在WPF中托管时为
null
,但在另一个WinForms应用程序中托管时具有值

进一步调查
我想这里的问题是,
.Owner
属于
Form
类型,在WPF应用程序中没有这种类型的实例。很难想象在这种情况下该属性会有什么有效值。因此,我似乎需要更改在Form1

中访问“.Owner”属性的代码,谢谢您的帮助--不过,我已经在我的btnAdd\u Click()方法中使用了WindowsFormsHost。我也尝试过直接在XAML中声明主机控件,但是我仍然遇到了在没有所有者的情况下打开后续表单的问题。我将尝试在我的问题中澄清这一点。好的,我修改了我的问题,将WindowsFormsHost放在XAML中,而不是在btnAdd_Click()中实例化它。不幸的是,我仍然遇到同样的问题。@doornail。。。你试过设置所有者吗???MyForm.Owner=此(WPF窗口);不幸的是,我不能这样做,因为表单是由WinForms用户控件创建的,而不是由WPF窗口本身创建的。我希望usercontrol1仍然能够调用
form1.Show(this)
。当用户控件位于WinForms窗体上时,该操作正常(form1的所有者设置为该父窗体)。当它位于WPF窗口上时,所有者为
null
<Window
  xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 
>

<my:WindowsFormsHost  Name="MapHost" ScrollViewer.CanContentScroll="False"  SizeChanged="MapHost_SizeChanged" />
MapHost.Child = MapControl;