This article has been localized into Czech by the community.
Ovládací prvek WindowsFormsHost
WPF a WinForms jsou dva odlišné UI frameworky, oba vytvořené společností Microsoft. WPF je určen jako modernější alternativa k WinForms, které byly prvním .NET UI frameworkem. Aby usnadnila přechod mezi nimi, společnost Microsoft zajistila, že ovládací prvky WinForms mohou být stále používány uvnitř aplikace WPF. To se provádí pomocí WindowsFormsHost, o kterém budeme hovořit v tomto článku.
Pro použití WindowsFormsHost a ovládacích prvků z WinForms je třeba přidat do vaší aplikace odkaz na následující sestavení:
- WindowsFormsIntegration
- System.Windows.Forms
Ve Visual Studiu toto provedete tak, že kliknete pravým tlačítkem na uzel "References (Odkazy)" ve vašem projektu a vyberete "Add reference (Přidat odkaz)":
V dialogovém okně, které se objeví, vyberte "Assemblies (Sestavení)" a poté zaškrtněte dvě sestavení, která potřebujeme přidat:
Použití ovládacího prvku WinForms WebBrowser (webový prohlížeč)
V předchozím článku jsme použili ovládací prvek WebBrowser ve WPF k vytvoření malého webového prohlížeče. Jak bylo uvedeno v tomto článku, ovládací prvek WebBrowser ve WPF je oproti verzi WinForms trochu omezený. Existuje mnoho příkladů, které lze snadno provést s WinForms a ve WPF jsou buď obtížněji proveditelné, nebo úplně nemožné.
Malým příkladem je vlastnost DocumentTitle a odpovídající událost DocumentTitleChanged, které umožňují snadno získat a aktualizovat název okna tak, aby odpovídal názvu aktuální webové stránky. Použijeme to jako záminku pro vyzkoušení verze WinForms přímo zde v naší aplikaci WPF:
<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;
}
}
}
Zvláštní pozornost věnujte řádku, kde přidáváme jmenný prostor WinForms k oknu, aby bylo možné odkazovat na ovládací prvky z něj:
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
To nám umožní odkazovat na ovládací prvky WinForms pomocí předpony wf.
Jak vidíte, WindowsFormsHost je poměrně jednoduchý na použití. Má vlastnost Child, ve které můžete definovat jeden ovládací prvek WinForms. Podobně, jako okno WPF, WinForms obsahuje také pouze jeden kořenový ovládací prvek. Pokud potřebujete více ovládacích prvků WinForms uvnitř vašeho WindowsFormsHost, můžete použít ovládací prvek Panel z WinForms nebo kterýkoliv z ostatních kontejnerových ovládacích prvků.
Ovládací prvek WebBrowser WinForms je používán s odkazem na sestavení System.Windows.Forms, použitím předpony wf, jak bylo vysvětleno výše.
V Code-behind provedeme počáteční volání Navigate, abychom místo prázdného ovládacího prvku měli při spuštění viditelnou webovou stránku. Poté zpracujeme událost DocumentTitleChanged, při které aktualizujeme vlastnost okna Title, v souladu s aktuální hodnotou DocumentTitle ovládacího prvku WebBrowser.
Gratuluji, nyní máte aplikaci WPF s ovládacím prvkem WebBrowser WinForms hostovaným uvnitř.
Shrnutí
Jak vidíte, použití ovládacích prvků WinForms uvnitř vašich aplikací WPF je poměrně snadné, ale zůstává otázka: Je to dobrý nápad?
Obecně se tomu můžete chtít vyhnout. Existuje celá řada problémů, které mohou nebo nemusí vaši aplikaci ovlivnit (mnoho z nich je popsáno v tomto článku MSDN: http://msdn.microsoft.com/en-us/library/aa970911%28v=VS.100%29.aspx), ale vážnějším problémem je, že tento druh míchání UI frameworků nemusí být podporováno v budoucích verzích .NET frameworku.
Nakonec je ale rozhodnutí na vás - opravdu potřebujete ovládací prvek WinForms, nebo existuje alternativa WPF, která by mohla fungovat stejně dobře?