WindowsFormsHost是否适合用途(.net WPF托管WinForms)?

时间:2008-09-10 11:29:13

标签: .net wpf winforms

GUI驱动的应用程序需要托管一些预构建的基于WinForms的组件。 这些组件使用GDI +和DirectX的混合提供高性能交互式视图。 视图处理控件输入并显示自定义图形渲染。 这些组件由供应商在WinForms工具中进行测试。

商业应用程序是否可以将WPF用于其GUI并依赖WindowsFormsHost来托管WinForms组件或 你有经验的技术故障,例如输入滞后,更新会让你小心的问题?

6 个答案:

答案 0 :(得分:21)

我们目前在我们的软件中使用WindowsFormsHost来托管WinForms DataGridView控件,我们没有遇到任何实际问题。但有几点需要注意:

第一个是air-space restrictions。实际上,这意味着WinForms内容始终出现在WPF内容之上。因此,如果您使用WPF装饰器,如果它们遇到您应用中的WinForms区域,它们似乎会被“修剪”。

第二个是,因为他们使用Windows资源,所以必须更仔细地管理WinForms组件的生命周期。与WPF组件不同,WinForms控件在完成后期望处理。这使得将它们包含在纯XAML视图中变得棘手。

最后一点是,WinForms控件似乎没有像WPF显示器的其他部分那样平滑地调整:一旦完成调整,它们往往会捕捉到新的大小。

答案 1 :(得分:4)

我遇到的一个问题是嵌入式Win Forms控件不参与应用于其WPF容器的任何转换操作。这导致视觉闪烁效果,并且嵌入式控制出现在不适当的位置。我通过将Windows窗体主机的可见性绑定到其WPF容器的动画状态来解决这个问题,以便隐藏嵌入式控件直到动画完成,如下所示。

<WindowsFormsHost Grid.Row="1" Grid.Column="1" Margin="8,0,0,0"
     Visibility="{Binding ActualHeight, RelativeSource={RelativeSource
     Mode=FindAncestor, AncestorType=UserControl},
     Converter={StaticResource WinFormsControlVisibilityConverter}}" >

     <winforms:DateTimePicker x:Name="datepickerOrderExpected" Width="140"
        Format="Custom" CustomFormat="M/dd/yy  h:mm tt"
        ValueChanged="OnEditDateTimeOrderExpected" />

</WindowsFormsHost>

答案 2 :(得分:0)

我在WinForms中托管了WPF控件,反之亦然。虽然,我会广泛测试这种情况,因为很难预测复杂的控制会如何表现。

答案 3 :(得分:0)

请注意在Winforms中托管时缺少WPF Application对象。如果您正在使用现有的WPF组件并将其托管在Winforms中,这可能会导致问题,因为资源查找和类似内容永远不会在应用程序范围内查找。如果有问题,您可以创建自己的Application对象。

答案 4 :(得分:0)

作为@Kent Boogaart mentioned,我遇到了WinForms中托管的WPF应用程序没有WPF Application对象(即Application.Current)的情况。这可能会导致许多问题,例如Dispatchers不会将线程调回UI线程。这只适用于你在WinForms中托管的情况,而不是相反。

我也遇到奇怪的问题,模态对话的行为很奇怪(即ShowModal调用)。我假设这是因为,在WinForms中,每个控件都有自己的Win32句柄,而在WPF中,整个Window只有一个句柄。

无论你做什么,测试:)

答案 5 :(得分:0)

您可以使用.net 3.5 SP1:

解决空域问题
  

这些类型的空域限制   代表了一个巨大的局限   框架,如WPF,其中元素   组成用于创造非常   丰富的用户体验。带有D3DImage   解决方案,这些限制都没有   更长的礼物!

请参阅Introduction to D3DImage