Sdílet prostřednictvím


Návod: Hostování složeného ovládacího prvku WPF ve Windows Forms

Windows Presentation Foundation (WPF) poskytuje bohaté prostředí pro vytváření aplikací. Pokud ale máte značné investice do kódu Modelu Windows Forms, může být efektivnější rozšířit stávající aplikaci Windows Forms o WPF, nikoli ji přepsat úplně od začátku. Běžným scénářem je vložení jednoho nebo více ovládacích prvků implementovaných pomocí WPF v rámci aplikace Windows Forms. Další informace o přizpůsobení ovládacích prvků WPF naleznete v tématu Přizpůsobení ovládacího prvku.

Tento návod vás provede aplikací, která hostí složený ovládací prvek WPF, abyste mohli zadávat data v aplikaci Windows Forms. Složený ovládací prvek je zabalen v knihovně DLL. Tento obecný postup lze rozšířit na složitější aplikace a ovládací prvky. Tento názorný postup je navržený tak, aby byl téměř identický vzhledem a funkcemi návodu: Hostování složeného ovládacího prvku Windows Forms ve WPF. Hlavním rozdílem je, že scénář hostování je obrácený.

Návod je rozdělený do dvou částí. První část stručně popisuje implementaci složeného ovládacího prvku WPF. Druhá část podrobně popisuje, jak hostovat složený ovládací prvek v aplikaci Windows Forms, přijímat události z ovládacího prvku a přistupovat k některým vlastnostem ovládacího prvku.

Mezi úlohy znázorněné v tomto názorném postupu patří:

  • Implementace složeného ovládacího prvku WPF

  • Implementace hostitelské aplikace Windows Forms

Úplný výpis kódu úkolů znázorněných v tomto návodu najdete v tématu Hostování složeného ovládacího prvku WPF ve Windows Forms Sample.

Požadavky

K dokončení tohoto návodu potřebujete Visual Studio.

Implementace složeného ovládacího prvku WPF

Složený ovládací prvek WPF použitý v tomto příkladu je jednoduchý formulář pro zadávání dat, který přebírá jméno a adresu uživatele. Když uživatel klikne na jedno ze dvou tlačítek a označí, že úkol je hotový, ovládací prvek vyvolá vlastní událost, která vrátí informace hostiteli. Následující obrázek znázorňuje vykreslený ovládací prvek.

Následující obrázek znázorňuje složený ovládací prvek WPF:

Snímek obrazovky znázorňující jednoduchý ovládací prvek WPF

Vytvoření projektu

Zahájení projektu:

  1. Spusťte Visual Studio a otevřete dialogové okno Nový projekt .

  2. V jazyce Visual C# a kategorii Windows vyberte šablonu knihovny uživatelského ovládacího prvku WPF .

  3. Pojmenujte nový projekt MyControls.

  4. Pro umístění zadejte pohodlně pojmenovanou složku nejvyšší úrovně, například WindowsFormsHostingWpfControl. Později vložíte hostitelskou aplikaci do této složky.

  5. Kliknutím na OK vytvořte projekt. Výchozí projekt obsahuje jeden ovládací prvek s názvem UserControl1.

  6. V Průzkumníku řešení přejmenujte UserControl1 na MyControl1.

Projekt by měl obsahovat odkazy na následující systémové knihovny DLL. Pokud některé z těchto knihoven DLL nejsou ve výchozím nastavení zahrnuté, přidejte je do projektu.

  • Prezentační jádro

  • PresentationFramework

  • Systém

  • WindowsBase

Vytvoření uživatelského rozhraní

Uživatelské rozhraní (UI) složeného ovládacího prvku se implementuje pomocí jazyka XAML (Extensible Application Markup Language). Složené uživatelské rozhraní ovládacího prvku se skládá z pěti TextBox prvků. Každý TextBox prvek má přidružený TextBlock prvek, který slouží jako popisek. Dole jsou dva Button prvky, OK a Storno. Když uživatel klikne na libovolné tlačítko, ovládací prvek vyvolá vlastní událost, která vrátí informace hostiteli.

Základní rozložení

Různé prvky uživatelského rozhraní jsou obsaženy v elementu Grid . Obsah složeného ovládacího prvku můžete uspořádat pomocí Grid stejným způsobem, jakým byste použili prvek Table v HTML. WPF má také prvek Table, ale Grid je lehčí a lépe se hodí pro jednoduché rozložení.

Následující XAML ukazuje základní rozložení. Tento XAML definuje celkovou strukturu ovládacího prvku zadáním počtu sloupců a řádků v elementu Grid .

V souboru MyControl1.xaml nahraďte existující XAML následujícím kódem XAML.

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="MyControls.MyControl1"
      Background="#DCDCDC"
      Width="375"
      Height="250"
      Name="rootElement"
      Loaded="Init">

  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto" />
    <ColumnDefinition Width="Auto"/>
    <ColumnDefinition Width="Auto"/>
  </Grid.ColumnDefinitions>

  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
</Grid>

Přidání elementů TextBlock a TextBox do mřížky

Prvek uživatelského rozhraní umístíte do mřížky nastavením RowProperty prvků a ColumnProperty atributů na odpovídající číslo řádku a sloupce. Nezapomeňte, že číslování řádků a sloupců je založené na nule. Pokud chcete nastavit jeho ColumnSpanProperty atribut, můžete mít prvek rozložený na více sloupců. Další informace o Grid prvcích naleznete v tématu Vytvoření elementu mřížky.

Následující kód XAML ukazuje složené ovládací prvky TextBox a TextBlock s jejich atributy RowProperty a ColumnProperty, nastavené k správnému umístění prvků do mřížky.

V Souboru MyControl1.xaml přidejte do elementu Grid následující XAML.

  <TextBlock Grid.Column="0"
        Grid.Row="0" 
        Grid.ColumnSpan="4"
        Margin="10,5,10,0"
        HorizontalAlignment="Center"
        Style="{StaticResource titleText}">Simple WPF Control</TextBlock>

  <TextBlock Grid.Column="0"
        Grid.Row="1"
        Style="{StaticResource inlineText}"
        Name="nameLabel">Name</TextBlock>
  <TextBox Grid.Column="1"
        Grid.Row="1"
        Grid.ColumnSpan="3"
        Name="txtName"/>

  <TextBlock Grid.Column="0"
        Grid.Row="2"
        Style="{StaticResource inlineText}"
        Name="addressLabel">Street Address</TextBlock>
  <TextBox Grid.Column="1"
        Grid.Row="2"
        Grid.ColumnSpan="3"
        Name="txtAddress"/>

  <TextBlock Grid.Column="0"
        Grid.Row="3"
        Style="{StaticResource inlineText}"
        Name="cityLabel">City</TextBlock>
  <TextBox Grid.Column="1"
        Grid.Row="3"
        Width="100"
        Name="txtCity"/>

  <TextBlock Grid.Column="2"
        Grid.Row="3"
        Style="{StaticResource inlineText}"
        Name="stateLabel">State</TextBlock>
  <TextBox Grid.Column="3"
        Grid.Row="3"
        Width="50"
        Name="txtState"/>

  <TextBlock Grid.Column="0"
        Grid.Row="4"
        Style="{StaticResource inlineText}"
        Name="zipLabel">Zip</TextBlock>
  <TextBox Grid.Column="1"
        Grid.Row="4"
        Width="100"
        Name="txtZip"/>

Stylování prvků uživatelského rozhraní

Mnoho prvků ve formuláři pro zadávání dat má podobný vzhled, což znamená, že mají stejná nastavení pro několik svých vlastností. Místo samostatného nastavení atributů jednotlivých prvků používá Style předchozí XAML elementy k definování standardních nastavení vlastností pro třídy prvků. Tento přístup snižuje složitost ovládacího prvku a umožňuje změnit vzhled více prvků prostřednictvím jednoho atributu stylu.

Prvky Style jsou obsaženy ve Grid vlastnosti elementu Resources , takže je mohou používat všechny prvky v ovládacím prvku. Pokud je styl pojmenovaný, použijete ho u elementu přidáním elementu Style nastaveného na název stylu. Styly, které nejsou pojmenovány, se stanou výchozím stylem prvku. Další informace o stylech WPF naleznete v tématu Styly a šablonování.

Následující XAML ukazuje Style prvky pro složený ovládací prvek. Pokud chcete zjistit, jak se styly použijí na prvky, podívejte se na předchozí XAML. Například poslední TextBlock prvek má inlineText styl a poslední TextBox prvek používá výchozí styl.

V MyControl1.xaml přidejte následující XAML hned za počáteční prvek Grid.

<Grid.Resources>
  <Style x:Key="inlineText" TargetType="{x:Type TextBlock}">
    <Setter Property="Margin" Value="10,5,10,0"/>
    <Setter Property="FontWeight" Value="Normal"/>
    <Setter Property="FontSize" Value="12"/>
  </Style>
  <Style x:Key="titleText" TargetType="{x:Type TextBlock}">
    <Setter Property="DockPanel.Dock" Value="Top"/>
    <Setter Property="FontWeight" Value="Bold"/>
    <Setter Property="FontSize" Value="14"/>
    <Setter Property="Margin" Value="10,5,10,0"/>
  </Style>
  <Style TargetType="{x:Type Button}">
    <Setter Property="Margin" Value="10,5,10,0"/>
    <Setter Property="Width" Value="60"/>
  </Style>
  <Style TargetType="{x:Type TextBox}">
    <Setter Property="Margin" Value="10,5,10,0"/>
  </Style>
</Grid.Resources>

Přidání tlačítek OK a Zrušit

Poslední prvky složeného ovládacího prvku jsou prvky OK a CancelButton , které zabírají první dva sloupce posledního Gridřádku . Tyto prvky používají běžnou obslužnou rutinu události ButtonClicked a výchozí Button styl definovaný v předchozím XAML.

V MyControl1.xaml přidejte následující XAML za poslední TextBox prvek. Část složeného ovládacího prvku XAML je teď dokončená.

<Button Grid.Row="5"
        Grid.Column="0"
        Name="btnOK"
        Click="ButtonClicked">OK</Button>
<Button Grid.Row="5"
        Grid.Column="1"
        Name="btnCancel"
        Click="ButtonClicked">Cancel</Button>

Implementace souboru Code-Behind

Soubor s kódem, MyControl1.xaml.cs, implementuje tři základní úlohy:

  1. Zpracovává událost, která nastane, když uživatel klikne na jedno z tlačítek.

  2. Načte data z TextBox prvků a zabalí je do objektu argumentu vlastní události.

  3. Vyvolá vlastní OnButtonClick událost, která oznámí hostiteli, že uživatel je hotový a předá data zpět hostiteli.

Ovládací prvek také zveřejňuje řadu vlastností barev a písem, které umožňují změnit vzhled. WindowsFormsHost Na rozdíl od třídy, která se používá k hostování ovládacího prvku Windows Forms, ElementHost třída zveřejňuje pouze vlastnost ovládacího prvkuBackground. Chcete-li zachovat podobnost mezi tímto příkladem kódu a příkladem probíraným v návodu: Hostování složeného ovládacího prvku Windows Forms ve WPF, ovládací prvek zveřejňuje zbývající vlastnosti přímo.

Základní struktura souboru Code-Behind

Soubor kódu se skládá z jednoho oboru názvů, MyControls, který bude obsahovat dvě třídy, MyControl1 a MyControlEventArgs.

namespace MyControls
{
  public partial class MyControl1 : Grid
  {
    //...
  }
  public class MyControlEventArgs : EventArgs
  {
    //...
  }
}

První třída , MyControl1je částečná třída obsahující kód, který implementuje funkce uživatelského rozhraní definované v MyControl1.xaml. Při Analýze Souboru MyControl1.xaml se XAML převede na stejnou částečnou třídu a dvě částečné třídy jsou sloučeny tak, aby vytvořily kompilovaný ovládací prvek. Z tohoto důvodu musí název třídy v souboru kódu za souborem odpovídat názvu třídy přiřazenému MyControl1.xaml a musí dědit z kořenového elementu ovládacího prvku. Druhá třída je MyControlEventArgstřída argumentů události, která se používá k odeslání dat zpět do hostitele.

Otevřete MyControl1.xaml.cs. Změňte existující deklaraci třídy tak, aby měla následující název a dědila z Grid.

public partial class MyControl1 : Grid

Inicializace ovládacího prvku

Následující kód implementuje několik základních úloh:

  • Deklaruje soukromou událost OnButtonClicka její přidružený delegát . MyControlEventHandler

  • Vytvoří několik privátních globálních proměnných, které ukládají data uživatele. Tato data jsou vystavena prostřednictvím odpovídajících vlastností.

  • Implementuje obslužnou rutinu Initpro událost ovládacího prvku Loaded . Tato obslužná rutina inicializuje globální proměnné přiřazením hodnot definovaných v Souboru MyControl1.xaml. K tomu využívá Name přiřazený typickému prvku TextBlocknameLabel, aby získal přístup k nastavení vlastností tohoto elementu.

Odstraňte existující konstruktor a do třídy přidejte následující kód MyControl1 .

public delegate void MyControlEventHandler(object sender, MyControlEventArgs args);
public event MyControlEventHandler OnButtonClick;
private FontWeight _fontWeight;
private double _fontSize;
private FontFamily _fontFamily;
private FontStyle _fontStyle;
private SolidColorBrush _foreground;
private SolidColorBrush _background;

private void Init(object sender, EventArgs e)
{
    //They all have the same style, so use nameLabel to set initial values.
    _fontWeight = nameLabel.FontWeight;
    _fontSize = nameLabel.FontSize;
    _fontFamily = nameLabel.FontFamily;
    _fontStyle = nameLabel.FontStyle;
    _foreground = (SolidColorBrush)nameLabel.Foreground;
    _background = (SolidColorBrush)rootElement.Background;
}

Zpracování událostí kliknutí na tlačítka

Uživatel indikuje, že úkol zadávání dat je dokončen kliknutím na tlačítko OK nebo tlačítko Storno . Obě tlačítka používají stejnou obslužnou Click rutinu události, ButtonClicked. Obě tlačítka mají názvy btnOK nebo btnCancel, které obslužné rutině umožňují určit, na které tlačítko bylo kliknuto zkoumáním hodnoty argumentu sender. Obslužná rutina provede následující:

  • Vytvoří MyControlEventArgs objekt, který obsahuje data z TextBox prvků.

  • Pokud uživatel klikne na tlačítko Storno, nastaví se vlastnost objektu MyControlEventArgsIsOK na false.

  • Aktivuje událost, aby oznámil do hostitelského systému, že uživatel je hotový, a vrátí zpět shromážděná data.

Za metodu MyControl1 přidejte do Init třídy následující kód.

private void ButtonClicked(object sender, RoutedEventArgs e)
{
    MyControlEventArgs retvals = new MyControlEventArgs(true,
                                                        txtName.Text,
                                                        txtAddress.Text,
                                                        txtCity.Text,
                                                        txtState.Text,
                                                        txtZip.Text);
    if (sender == btnCancel)
    {
        retvals.IsOK = false;
    }
    if (OnButtonClick != null)
        OnButtonClick(this, retvals);
}

Vytváření vlastností

Zbývající část třídy jednoduše zveřejňuje vlastnosti, které odpovídají globálním proměnným probíraným dříve. Když se vlastnost změní, objekt set accessor upraví vzhled ovládacího prvku změnou odpovídajících vlastností elementu a aktualizací podkladových globálních proměnných.

Do třídy přidejte následující kód MyControl1 .

public FontWeight MyControl_FontWeight
{
    get { return _fontWeight; }
    set
    {
        _fontWeight = value;
        nameLabel.FontWeight = value;
        addressLabel.FontWeight = value;
        cityLabel.FontWeight = value;
        stateLabel.FontWeight = value;
        zipLabel.FontWeight = value;
    }
}
public double MyControl_FontSize
{
    get { return _fontSize; }
    set
    {
        _fontSize = value;
        nameLabel.FontSize = value;
        addressLabel.FontSize = value;
        cityLabel.FontSize = value;
        stateLabel.FontSize = value;
        zipLabel.FontSize = value;
    }
}
public FontStyle MyControl_FontStyle
{
    get { return _fontStyle; }
    set
    {
        _fontStyle = value;
        nameLabel.FontStyle = value;
        addressLabel.FontStyle = value;
        cityLabel.FontStyle = value;
        stateLabel.FontStyle = value;
        zipLabel.FontStyle = value;
    }
}
public FontFamily MyControl_FontFamily
{
    get { return _fontFamily; }
    set
    {
        _fontFamily = value;
        nameLabel.FontFamily = value;
        addressLabel.FontFamily = value;
        cityLabel.FontFamily = value;
        stateLabel.FontFamily = value;
        zipLabel.FontFamily = value;
    }
}

public SolidColorBrush MyControl_Background
{
    get { return _background; }
    set
    {
        _background = value;
        rootElement.Background = value;
    }
}
public SolidColorBrush MyControl_Foreground
{
    get { return _foreground; }
    set
    {
        _foreground = value;
        nameLabel.Foreground = value;
        addressLabel.Foreground = value;
        cityLabel.Foreground = value;
        stateLabel.Foreground = value;
        zipLabel.Foreground = value;
    }
}

Odeslání dat zpět do hostitele

Poslední komponenta MyControlEventArgs v souboru je třída, která se používá k odeslání shromážděných dat zpět do hostitele.

Do svého MyControls oboru názvů přidejte následující kód. Implementace je jednoduchá a neprobírá se dále.

public class MyControlEventArgs : EventArgs
{
    private string _Name;
    private string _StreetAddress;
    private string _City;
    private string _State;
    private string _Zip;
    private bool _IsOK;

    public MyControlEventArgs(bool result,
                              string name,
                              string address,
                              string city,
                              string state,
                              string zip)
    {
        _IsOK = result;
        _Name = name;
        _StreetAddress = address;
        _City = city;
        _State = state;
        _Zip = zip;
    }

    public string MyName
    {
        get { return _Name; }
        set { _Name = value; }
    }
    public string MyStreetAddress
    {
        get { return _StreetAddress; }
        set { _StreetAddress = value; }
    }
    public string MyCity
    {
        get { return _City; }
        set { _City = value; }
    }
    public string MyState
    {
        get { return _State; }
        set { _State = value; }
    }
    public string MyZip
    {
        get { return _Zip; }
        set { _Zip = value; }
    }
    public bool IsOK
    {
        get { return _IsOK; }
        set { _IsOK = value; }
    }
}

Sestavte řešení. Sestavení vytvoří knihovnu DLL s názvem MyControls.dll.

Implementace hostitelské aplikace Windows Forms

Hostitelská aplikace Windows Forms používá ElementHost objekt k hostování složeného ovládacího prvku WPF. Aplikace zpracovává OnButtonClick událost, aby přijímala data z složeného ovládacího prvku. Aplikace má také sadu přepínačů, která můžete použít k úpravě vzhledu ovládacího prvku. Následující obrázek znázorňuje aplikaci.

Následující obrázek ukazuje složený ovládací prvek WPF hostovaný v aplikaci Windows Forms.

Snímek obrazovky znázorňující ovládací prvek Windows Form Hosting Avalon

Vytvoření projektu

Zahájení projektu:

  1. Spusťte Visual Studio a otevřete dialogové okno Nový projekt .

  2. V aplikaci Visual C# a kategorii Windows vyberte šablonu Windows Forms aplikace.

  3. Pojmenujte nový projekt WFHost.

  4. Pro umístění zadejte stejnou složku nejvyšší úrovně, která obsahuje projekt MyControls.

  5. Kliknutím na OK vytvořte projekt.

Musíte také přidat odkazy na knihovnu DLL, která obsahuje MyControl1 a další sestavení.

  1. V Průzkumníku řešení klikněte pravým tlačítkem myši na název projektu a vyberte Přidat odkaz.

  2. Klikněte na kartu Procházet a přejděte do složky, která obsahuje MyControls.dll. Pro účely tohoto názorného postupu je tato složka MyControls\bin\Debug.

  3. Vyberte MyControls.dlla klepněte na tlačítko OK.

  4. Přidejte odkazy na následující sestavení.

    • Prezentační jádro

    • PresentationFramework

    • System.Xaml

    • WindowsBase

    • WindowsFormsIntegration

Implementace uživatelského rozhraní pro aplikaci

Uživatelské rozhraní pro aplikaci Windows Form obsahuje několik ovládacích prvků pro interakci s složeným ovládacím prvku WPF.

  1. Otevřete formulář 1 v návrháři formulářů systému Windows.

  2. Zvětšete formulář tak, aby vyhovoval ovládacím prvkům.

  3. V pravém horním rohu formuláře přidejte System.Windows.Forms.Panel ovládací prvek pro uložení složeného ovládacího prvku WPF.

  4. Do formuláře přidejte následující System.Windows.Forms.GroupBox ovládací prvky.

    Název Text
    groupBox1 Barva pozadí
    groupBox2 Barva popředí
    groupBox3 Velikost písma
    groupBox4 Rodina písem
    groupBox5 Styl písma
    groupBox6 Tloušťka písma
    groupBox7 Data z ovládacího prvku
  5. Do ovládacích System.Windows.Forms.RadioButton prvků přidejte následující System.Windows.Forms.GroupBox ovládací prvky.

    GroupBox Název Text
    groupBox1 radioBackgroundOriginal Původní
    groupBox1 RadioPozadíSvětleZelená Světle zelená
    groupBox1 radioBackgroundLightSalmon LightSalmon
    groupBox2 Původní popředí rádia Původní
    groupBox2 RadioForegroundRed Červený
    groupBox2 RádioPopředíŽlutá Žlutá
    groupBox3 původníVelikostRádia Původní
    groupBox3 radioSizeTen 10
    groupBox3 radioSizeTwelve 12
    groupBox4 radioFamilyOriginal Původní
    groupBox4 radioFamilyTimes Časy Nový Roman
    groupBox4 radioFamilyWingDings Wingdings
    groupBox5 radioStyleOriginal Normální
    groupBox5 radioStyleItalic Kurzíva
    groupBox6 radioWeightOriginal Původní
    groupBox6 radioWeightBold Tučné
  6. Přidejte následující System.Windows.Forms.Label ovládací prvky na poslední System.Windows.Forms.GroupBox. Tyto ovládací prvky zobrazují data vrácená složeným ovládacím prvku WPF.

    GroupBox Název Text
    groupBox7 lblName Jméno:
    groupBox7 LblAddress Adresa ulice:
    groupBox7 LblCity Město:
    groupBox7 lblState Stát:
    groupBox7 LblZip PSČ:

Inicializace formuláře

Obecně implementujete hostitelský kód v obslužné rutině Load události formuláře. Následující kód ukazuje obslužnou rutinu Load události, obslužnou rutinu události složeného ovládacího prvku Loaded WPF a deklarace pro několik globálních proměnných, které se používají později.

V nástroji Windows Forms Designer poklikejte na formulář a vytvořte obslužnou rutinu Load události. V horní části Form1.cs přidejte následující using příkazy.

using System.Windows;
using System.Windows.Forms.Integration;
using System.Windows.Media;

Nahraďte obsah existující Form1 třídy následujícím kódem.

private ElementHost ctrlHost;
private MyControls.MyControl1 wpfAddressCtrl;
System.Windows.FontWeight initFontWeight;
double initFontSize;
System.Windows.FontStyle initFontStyle;
System.Windows.Media.SolidColorBrush initBackBrush;
System.Windows.Media.SolidColorBrush initForeBrush;
System.Windows.Media.FontFamily initFontFamily;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    ctrlHost = new ElementHost();
    ctrlHost.Dock = DockStyle.Fill;
    panel1.Controls.Add(ctrlHost);
    wpfAddressCtrl = new MyControls.MyControl1();
    wpfAddressCtrl.InitializeComponent();
    ctrlHost.Child = wpfAddressCtrl;

    wpfAddressCtrl.OnButtonClick +=
        new MyControls.MyControl1.MyControlEventHandler(
        avAddressCtrl_OnButtonClick);
    wpfAddressCtrl.Loaded += new RoutedEventHandler(
        avAddressCtrl_Loaded);
}

void avAddressCtrl_Loaded(object sender, EventArgs e)
{
    initBackBrush = (SolidColorBrush)wpfAddressCtrl.MyControl_Background;
    initForeBrush = wpfAddressCtrl.MyControl_Foreground;
    initFontFamily = wpfAddressCtrl.MyControl_FontFamily;
    initFontSize = wpfAddressCtrl.MyControl_FontSize;
    initFontWeight = wpfAddressCtrl.MyControl_FontWeight;
    initFontStyle = wpfAddressCtrl.MyControl_FontStyle;
}

Metoda Form1_Load v předchozím kódu ukazuje obecný postup pro hostování ovládacího prvku WPF:

  1. Vytvořte nový ElementHost objekt.

  2. Nastavte vlastnost Dock ovládacího prvku na DockStyle.Fill.

  3. Přidejte ovládací prvek ElementHost do kolekce Panel ovládacího prvku Controls.

  4. Vytvořte instanci ovládacího prvku WPF.

  5. Hostujte složený ovládací prvek ve formuláři přiřazením ovládacího prvku k ElementHost vlastnosti ovládacího prvku Child .

Zbývající dva řádky v Form1_Load obslužných rutinách metody připojte ke dvěma událostem ovládacího prvku:

  • OnButtonClick je vlastní událost, která se aktivuje složeným ovládacím prvku, když uživatel klikne na tlačítko OK nebo Zrušit . Událost zpracujete, abyste získali odpověď uživatele a shromáždili všechna data, která uživatel zadal.

  • Loaded je standardní událost, která je vyvolána ovládacím prvku WPF při plném načtení. Událost se zde používá, protože příklad potřebuje inicializovat několik globálních proměnných pomocí vlastností z ovládacího prvku. V okamžiku události formuláře Load není ovládací prvek plně načten a tyto hodnoty jsou stále nastaveny na null. Než budete mít k těmto vlastnostem přístup, musíte počkat, až dojde k události ovládacího prvku Loaded .

Obslužná rutina Loaded události se zobrazí v předchozím kódu. Obslužná rutina OnButtonClick je popsána v další části.

Zpracování události kliknutí na tlačítko

K OnButtonClick události dojde, když uživatel klikne na tlačítko OK nebo Zrušit .

Obslužná rutina události zkontroluje pole argumentu IsOK události a určí, na které tlačítko se kliklo. Proměnné lbldat odpovídají ovládacím prvkům Label , které byly popsány dříve. Pokud uživatel klikne na tlačítko OK , data z ovládacích prvků ovládacího prvku TextBox se přiřadí k odpovídajícímu Label ovládacímu prvku. Pokud uživatel klikne na tlačítko Storno, Text hodnoty se nastaví na výchozí řetězce.

Do třídy Form1 přidejte kód obslužné rutiny události pro kliknutí na tlačítko.

void avAddressCtrl_OnButtonClick(
    object sender,
    MyControls.MyControl1.MyControlEventArgs args)
{
    if (args.IsOK)
    {
        lblAddress.Text = "Street Address: " + args.MyStreetAddress;
        lblCity.Text = "City: " + args.MyCity;
        lblName.Text = "Name: " + args.MyName;
        lblState.Text = "State: " + args.MyState;
        lblZip.Text = "Zip: " + args.MyZip;
    }
    else
    {
        lblAddress.Text = "Street Address: ";
        lblCity.Text = "City: ";
        lblName.Text = "Name: ";
        lblState.Text = "State: ";
        lblZip.Text = "Zip: ";
    }
}

Sestavte a spusťte aplikaci. Přidejte nějaký text do složeného ovládacího prvku WPF a klepněte na tlačítko OK. Text se zobrazí v popiscích. V tomto okamžiku nebyl kód přidán k zpracování přepínačů.

Úprava vzhledu ovládacího prvku

Ovládací RadioButton prvky ve formuláři umožní uživateli změnit barvy popředí a pozadí složeného ovládacího prvku WPF a také několik vlastností písma. Barva pozadí je vystavena objektem ElementHost . Zbývající vlastnosti jsou vystaveny jako vlastní vlastnosti ovládacího prvku.

Poklikejte na každý RadioButton ovládací prvek ve formuláři a vytvořte CheckedChanged obslužné rutiny událostí. Obslužné CheckedChanged rutiny událostí nahraďte následujícím kódem.

private void radioBackgroundOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Background = initBackBrush;
}

private void radioBackgroundLightGreen_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Background = new SolidColorBrush(Colors.LightGreen);
}

private void radioBackgroundLightSalmon_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Background = new SolidColorBrush(Colors.LightSalmon);
}

private void radioForegroundOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Foreground = initForeBrush;
}

private void radioForegroundRed_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Foreground = new System.Windows.Media.SolidColorBrush(Colors.Red);
}

private void radioForegroundYellow_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_Foreground = new System.Windows.Media.SolidColorBrush(Colors.Yellow);
}

private void radioFamilyOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = initFontFamily;
}

private void radioFamilyTimes_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = new System.Windows.Media.FontFamily("Times New Roman");
}

private void radioFamilyWingDings_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontFamily = new System.Windows.Media.FontFamily("WingDings");
}

private void radioSizeOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontSize = initFontSize;
}

private void radioSizeTen_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontSize = 10;
}

private void radioSizeTwelve_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontSize = 12;
}

private void radioStyleOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontStyle = initFontStyle;
}

private void radioStyleItalic_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontStyle = System.Windows.FontStyles.Italic;
}

private void radioWeightOriginal_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontWeight = initFontWeight;
}

private void radioWeightBold_CheckedChanged(object sender, EventArgs e)
{
    wpfAddressCtrl.MyControl_FontWeight = FontWeights.Bold;
}

Sestavte a spusťte aplikaci. Kliknutím na různá přepínače zobrazíte efekt složeného ovládacího prvku WPF.

Viz také