This article has been localized into Danish by the community.
WindowsFormsHost kontrollen
WPF og WinForms er to adskilte UI frameworks, der begge er udviklet af Microsoft. WPF er tænkt som et mere moderne alternativ til WinForms, som var det første .NET UI framework. For at lette transitionen mellem de to sørgede Microsoft for, at WinForms kontroller stadig kunne bruges inde i en WPF applikation. Dette gøres med WindowsFormsHost, som vi vil diskutere i denne artikel.
For at bruge WindowsFormsHost og kontroller fra WinForms, skal du tilføje en reference til de følgende assemblies i din applikation:
- WindowsFormsIntegration
- System.Windows.Forms
I Visual Studio gøres dette ved at højre-klikke på "References" noden i dit projekt og vælge "Add reference":
I dialogen, som dukker op, skal du vælge "Assemblies" og derefter afmærke de to assemblies, som vi skal tilføje:
Brug af WinForms WebBrowser kontrollen
I en tidligere artikel brugte vi WPF WebBroser kontrollen til at lave en lille web-browser. Men, som nævnt i artiklen, WPF WebBrowser kontrollen er en del begrænset sammenligned med WinForms versionen. Der er mange eksempler på ting, der nemt gøres med WinForms versionen, som enten er sværere eller helt umulige at gøre med WPF versionen.
Et lille eksempel er DocumentTitle egenskaben og den tilhørende DocumentTitleChanges hændelse, som gør det nemt at hente og opdatere vinduestitlen på den aktuelle web-side. Vi vil bruge dette som en undskyldning for at teste WinForms versionen lige her i vores WPF applikation:
<Window x:Class="WpfTutorialSamples.Misc_controls.WindowsFormsHostSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Title="WindowsFormsHostSample" Height="350" Width="450">
<Grid>
<WindowsFormsHost Name="wfhSample">
<WindowsFormsHost.Child>
<wf:WebBrowser DocumentTitleChanged="wbWinForms_DocumentTitleChanged" />
</WindowsFormsHost.Child>
</WindowsFormsHost>
</Grid>
</Window>
using System;
using System.Windows;
namespace WpfTutorialSamples.Misc_controls
{
public partial class WindowsFormsHostSample : Window
{
public WindowsFormsHostSample()
{
InitializeComponent();
(wfhSample.Child as System.Windows.Forms.WebBrowser).Navigate("http://www.wpf-tutorial.com");
}
private void wbWinForms_DocumentTitleChanged(object sender, EventArgs e)
{
this.Title = (sender as System.Windows.Forms.WebBrowser).DocumentTitle;
}
}
}
Læg især mærke til linjen, hvor vi tilføjer WinForms namespacet til vinduet, så vi kan referere kontroller fra det:
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Dette vil give os mulighed for at referere WinForms kontroller via wf: præfixet.
WindowsFormsHost er rimelig simpel at bruge, som du kan se. Den har en Child egenskab, hvor du kan definere en enkelt WinForms kontrol, ganske som WPF Window kun indeholder en enkelt rod-kontrol. Har du brug for flere kontroller fra WinForms inden i din WindowsFormsHost, kan du bruge Panel kontrollen fra WinForms eller en af de andre container-kontroller.
WinForms WebBrowser kontrollen bruges ved at referere System.Windows.Forms assembly via wf præfixet, som forklaret ovenfor.
I code-behind laver vi et indledende kald til Navigate for at have en synlig web-side i stedet for en tom kontrol ved start. Vi håndterer derefter DocumentTitleChanged hændelsen, hvor vi opdaterer Title egenskaben på Window i overensstemmelse med den aktuelle DocumentTitle værdi på WebBrowser kontrollen.
Tillykke, nu har du en WPF applikationn med en WinForms WebBrowser inden i sig.
Resume
Som du kan se, er brugen af WinForms kontroller inde i en WPF applikation ret nemt, men spørgsmålet er: Er det en god ide?
Generelt vil du nok prøve at undgå det. Der er en masse problemer, som måske eller måske ikke vil have indvirkning på din applikation (en masse af dem er beskrevet i denne MSDN artikel: http://msdn.microsoft.com/en-us/library/aa970911%28v=VS.100%29.aspx), men et mere seriøst problem er, at denne slags UI framework sammenblanding måske ikke understøttes i fremtidige versioner af .NET framework.
Til syvende og sidst er beslutningen op til dig - har du virkelig brug for WinForms kontrollen, eller er der WPF alternativer, som måske virker lige så godt?