10

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

商业应用程序是否可以将 WPF 用于其 GUI 并依赖WindowsFormsHost来托管 WinForms 组件,或者您是否遇到过技术故障,例如输入延迟、更新问题而让您谨慎?

4

6 回答 6

21

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

首先是空域限制。实际上,这意味着 WinForms 内容总是出现在 WPF 内容之上。因此,如果您使用 WPF 装饰器,如果它们碰到您应用程序中的 WinForms 区域,它们将看起来被“修剪”。

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

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

于 2008-09-10T12:25:02.293 回答
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>
于 2008-09-16T07:26:29.340 回答
0

我在 WinForms 中托管 WPF 控件,反之亦然,没有问题。不过,我会广泛测试这些场景,因为很难预测复杂控制的行为方式。

于 2008-09-10T11:32:52.230 回答
0

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

于 2008-09-10T12:12:29.047 回答
0

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

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

不管你做什么,测试:)

于 2008-09-10T12:28:30.443 回答
0

您可以使用 .net 3.5 SP1 解决空域问题:

这些类型的空域限制代表了框架中的巨大限制,例如 WPF,其中元素组合用于创建非常丰富的用户体验。使用 D3DImage 解决方案,这些限制不再存在!

请参阅D3DImage 简介

于 2008-09-10T15:15:37.390 回答