代码之家  ›  专栏  ›  技术社区  ›  morechilli

WindowsFormsShost是否适合使用(.NET WPF托管WinForms)?

  •  10
  • morechilli  · 技术社区  · 16 年前

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

    商业应用程序能否使用WPF作为其GUI并依赖于 WindowsFormsHost 托管WinForms组件或 您是否经历过技术故障,例如输入延迟、更新问题,这些问题会使您保持谨慎?

    6 回复  |  直到 14 年前
        1
  •  21
  •   Samuel Jack    16 年前

    我们目前正在软件中使用windowsformshost来托管winforms数据报视图控件,我们还没有遇到任何实际问题。不过,还有几点需要注意:

    第一个是 air-space restrictions . 实际上,这意味着WinForms内容总是出现在WPF内容之上。因此,如果您使用的是WPF装饰器,那么当它们碰到应用程序中的winforms区域时,它们看起来将被“修剪”。

    第二个问题是,因为它们使用Windows资源,所以您必须更仔细地管理WinForms组件的生命周期。与WPF组件不同,WinForms控件希望在使用完后被释放。这使得在纯XAML视图中包含它们变得很困难。

    最后一件事是,WinForms控件的大小调整似乎没有WPF显示的其他控件平滑:完成调整后,它们往往会快速调整到新的大小。

        2
  •  4
  •   AndyL    16 年前

    我遇到的一个问题是,嵌入的Win表单控件不参与应用于其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>
    
        3
  •  0
  •   aku    16 年前

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

        4
  •  0
  •   Kent Boogaart    16 年前

    注意没有WPF Application 在WinForms中承载时的对象。如果您使用现有的WPF组件并将其托管在WinForms中,这可能会导致问题,因为资源查找和类似项永远不会在应用程序范围内查找。你可以自己创造 应用 如果是问题,则返回。

        5
  •  0
  •   Community Mr_and_Mrs_D    7 年前

    AS @Kent Boogaart mentioned ,我遇到了这样一种情况:WinForms中承载的WPF应用程序没有WPF应用程序对象(即application.current)。这可能会导致许多问题,例如调度器没有调用线程返回到UI线程。这只适用于在WinForms中托管的情况,而不是相反。

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

    无论你做什么,测试:)

        6
  •  0
  •   Artur Carvalho    16 年前

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

    这些类型的空域限制 表示在 框架,如wpf,where元素 构图是用来创造 丰富的用户体验。带D3DIMGE 解决方案,这些限制不是 更长的礼物!

    Introduction to D3DImage .