GUI驱动的应用程序需要托管一些预构建的基于WinForms的组件。 这些组件使用GDI +和DirectX的混合提供高性能交互式视图。 视图处理控件输入并显示自定义图形渲染。 这些组件由供应商在WinForms工具中进行测试。
商业应用程序是否可以将WPF用于其GUI并依赖WindowsFormsHost来托管WinForms组件或 你有经验的技术故障,例如输入滞后,更新会让你小心的问题?
答案 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 解决方案,这些限制都没有 更长的礼物!