2008-09-10 11 views
10

Eine GUI-basierte Anwendung muss einige vorgefertigte WinForms-basierte Komponenten hosten. Diese Komponenten bieten leistungsstarke interaktive Ansichten mit einer Mischung aus GDI + und DirectX. Die Ansichten behandeln die Steuereingabe und zeigen benutzerdefinierte grafische Renderings an. Die Komponenten werden vom Lieferanten in einem WinForms- Kabelbaum getestet.Ist WindowsFormsHost für den Zweck geeignet (. NET WPF hostet WinForms)?

Kann eine kommerzielle Anwendung WPF für ihre GUI verwenden und sich auf WindowsFormsHost als Host für die WinForms-Komponenten oder mit technischen Problemen wie z. Input-Lags, update Probleme, die Sie vorsichtig machen würden?

Antwort

21

Wir verwenden derzeit WindowsFormsHost in unserer Software, um das WinForms DataGridView-Steuerelement zu hosten, und wir hatten keine wirklichen Probleme damit. Ein paar Dinge zu beachten:

Die erste ist die air-space restrictions. In der Praxis bedeutet dies, dass der Inhalt von WinForms immer oberhalb von WPF-Inhalten angezeigt wird. Wenn Sie also WPF-Adorner verwenden, werden sie scheinbar "getrimmt", wenn sie in Ihrer App gegen eine WinForms-Region stoßen.

Die zweite ist, dass Sie die Lebensdauer von WinForms-Komponenten sorgfältiger verwalten müssen, da sie Windows-Ressourcen verwenden. Im Gegensatz zu WPF-Komponenten wird erwartet, dass WinForms-Steuerelemente nach Abschluss des Vorgangs verworfen werden. Dies macht es schwierig, sie in eine reine XAML-Ansicht aufzunehmen.

Die letzte Sache ist, dass WinForms-Steuerelemente nicht so reibungslos wie der Rest der WPF-Anzeige Größe ändern: Sie neigen dazu, auf ihre neue Größe zu schnappen, sobald Sie eine Anpassung abgeschlossen haben.

0

Ich hostet WPF-Steuerelemente in WinForms und umgekehrt ohne Probleme. Allerdings würde ich solche Szenarien ausgiebig testen, da es schwierig ist vorherzusagen, wie sich komplexe Steuerung verhalten wird.

+1

Ich denke, Sie beziehen sich auf 'ElementHost', nicht' WindowsFormsHost'. –

0

Beachten Sie die Abwesenheit eines WPF Application Objekts beim Hosten in Winforms. Dies kann zu Problemen führen, wenn Sie eine vorhandene WPF-Komponente verwenden und sie in Winforms hosten, da Ressourcensuche und ähnliche Funktionen niemals im Anwendungsbereich der Anwendung angezeigt werden. Sie können Ihr eigenes Objekt Application erstellen, wenn es ein Problem ist.

+0

Ich denke, Sie beziehen sich auf 'ElementHost', nicht auf' WindowsFormsHost'. Vielleicht ist das Gegenteil umgekehrt. –

0

Wie @Kent Boogaart mentioned, ich habe in der Situation, wo eine WPF-Anwendung in WinForms gehostet nicht das WPF-Anwendung Objekt (d. H. Application.Current). Dies kann viele Probleme verursachen, z. B. wenn Dispatcher Threads nicht zurück zum UI-Thread aufrufen. Dies trifft nur zu, wenn Sie in WinForms hosten und nicht umgekehrt.

Ich hatte auch seltsame Probleme mit modalen Dialogen verhalten sich seltsam (d. H. ShowModal Anrufe). Ich nehme an, dies liegt daran, dass in WinForms jedes Steuerelement über ein eigenes Win32-Handle verfügt, während es in WPF nur ein Handle für das gesamte Fenster gibt.

Was auch immer Sie tun, Test :)

0

Sie können das Airspace Problem lösen, indem .net 3.5 SP1 mit:

Diese Arten von Luftraumbeschränkungen eine große Einschränkung in einem Rahmen darstellen, wie WPF, wo Element Zusammensetzung verwendet wird, um sehr reiche Benutzererfahrungen zu erstellen. Bei einer D3DImage Lösung sind diese Einschränkungen nicht länger vorhanden!

Siehe Introduction to D3DImage.

+2

Artur, Der von Ihnen erwähnte Artikel bezieht sich auf D3D und nicht auf das Hosting von WinForms-Inhalten. Wenn ich die Probleme richtig verstehe, ist das Luftraumproblem ein grundlegendes Problem in Bezug auf die Art, wie Win32 funktioniert, da es unwahrscheinlich ist, dass es jemals verschwindet. –

+0

Habe das heute gesehen. Du hast Recht, es ist nur D3D. –

4

Ein Problem, das ich habe, ist, dass eingebettete Win Forms-Steuerelemente nicht an Transformationsoperationen teilnehmen, die auf ihren WPF-Container angewendet werden. Dies führt zu visuellen Blinkeffekten und das eingebettete Steuerelement erscheint an einer falschen Stelle. Ich habe daran gearbeitet, indem ich die Sichtbarkeit des Windows Forms-Hosts an den Animationsstatus des WPF-Containers gebunden habe, sodass das eingebettete Steuerelement bis zum Abschluss der Animation ausgeblendet wurde (siehe unten).

<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> 
Verwandte Themen