Megosztás a következőn keresztül:


Útmutató: WPF összetett vezérlő üzemeltetése a Windows Formsban

A Windows Presentation Foundation (WPF) gazdag környezetet biztosít az alkalmazások létrehozásához. Ha azonban jelentős befektetéssel rendelkezik a Windows Forms-kódba, hatékonyabb lehet a meglévő Windows Forms-alkalmazás kiterjesztése a WPF-sel ahelyett, hogy az alapoktól átírható lenne. Gyakori eset, ha egy vagy több, a WPF-ben implementált vezérlőt szeretne beágyazni a Windows Forms-alkalmazásba. A WPF-vezérlők testreszabásáról további információt a Testreszabásicímű témakörben talál.

Ez az útmutató végigvezeti egy WPF összetett vezérlőt futtató alkalmazáson, amely adatbevitelt hajt végre egy Windows Forms-alkalmazásban. Az összetett vezérlő dll-fájlba van csomagolva. Ez az általános eljárás összetettebb alkalmazásokra és vezérlőkre is kiterjeszthető. Ez az útmutató úgy lett kialakítva, hogy megjelenésében és funkcionalitásában majdnem azonos legyen a útmutatóval: Windows Forms Összetett Vezérlő üzemeltetése WPF-ben. Az elsődleges különbség az, hogy az üzemeltetési forgatókönyv fordított.

Az útmutató két részre van osztva. Az első szakasz röviden ismerteti a WPF összetett vezérlő implementációját. A második szakasz részletesen ismerteti, hogyan üzemeltetheti az összetett vezérlőt egy Windows Forms-alkalmazásban, hogyan fogadhat eseményeket a vezérlőből, és hogyan férhet hozzá a vezérlő egyes tulajdonságaihoz.

Az ebben az útmutatóban bemutatott feladatok a következők:

  • A WPF összetett vezérlő implementálása.

  • Windows Forms gazdaalkalmazás implementálása.

Az ebben az útmutatóban bemutatott feladatok teljes kódlistájáért lásd a WPF összetett vezérlő Windows Forms mintában történő üzemeltetését.

Előfeltételek

Az útmutató elvégzéséhez a Visual Studióra van szüksége.

A WPF összetett vezérlő implementálása

Az ebben a példában használt WPF összetett vezérlő egy egyszerű adatbeviteli űrlap, amely a felhasználó nevét és címét veszi fel. Ha a felhasználó a két gomb egyikére kattintva jelzi, hogy a feladat befejeződött, a vezérlő egy egyéni eseményt hoz létre, amely visszaadja az adatokat a gazdagépnek. Az alábbi ábrán a renderelt vezérlő látható.

Az alábbi képen egy WPF összetett vezérlő látható:

Képernyőkép egy egyszerű WPF-vezérlőről.

A projekt létrehozása

A projekt indítása:

  1. Indítsa el a Visual Studiót, és nyissa meg az Új projekt párbeszédpanelt.

  2. A Visual C# és a Windows kategóriában válassza a WPF felhasználói vezérlőtár sablont.

  3. Nevezze el az új projektet MyControls.

  4. A helyhez adjon meg egy kényelmesen elnevezett legfelső szintű mappát, például WindowsFormsHostingWpfControl. Később ebbe a mappába helyezi a gazdaalkalmazást.

  5. Kattintson OK gombra a projekt létrehozásához. Az alapértelmezett projekt egy UserControl1nevű vezérlőt tartalmaz.

  6. A Megoldáskezelőben nevezze át UserControl1MyControl1.

A projektnek a következő rendszer DLL-ekre kell hivatkoznia. Ha ezek közül a DLL-ek közül bármelyik alapértelmezés szerint nem szerepel, vegye fel őket a projektbe.

  • Bemutatómag

  • PresentationFramework

  • Rendszer

  • WindowsBase

A felhasználói felület létrehozása

Az összetett vezérlő felhasználói felülete (UI) az Extensible Application Markup Language (XAML) használatával van implementálva. Az összetett vezérlő felhasználói felülete öt TextBox elemből áll. Minden TextBox elemhez tartozik egy társított TextBlock elem, amely címkeként szolgál. Alul két Button elem található, OK és Mégse. Amikor a felhasználó bármelyik gombra kattint, a vezérlő létrehoz egy egyéni eseményt, amely visszaadja az információkat a gazdagépnek.

Alapszintű elrendezés

A különböző felhasználói felületi elemek egy Grid elemben találhatók. A Grid használatával ugyanúgy rendezheti el az összetett vezérlő tartalmát, mint a HTML-ben egy Table elemet. A WPF Table elemet is kínál, de Grid egyszerűbb és egyszerűbb elrendezési feladatokhoz jobban megfelel.

Az alábbi XAML az alapszintű elrendezést mutatja. Ez az XAML a vezérlőelem általános szerkezetét határozza meg a Grid elem oszlopainak és sorainak számával.

A MyControl1.xaml fájlban cserélje le a meglévő XAML-t a következő XAML-ra.

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

TextBlock és TextBox-elemek hozzáadása a rácshoz

Egy felhasználói felületi elemet úgy helyezhet el a rácson, hogy az elem RowProperty és ColumnProperty attribútumait a megfelelő sor- és oszlopszámra állítja. Ne feledje, hogy a sor- és oszlopszámozás nulla alapú. Egy elem több oszlopra is kiterjedhet a ColumnSpanProperty attribútum beállításával. A Grid elemekről további információt a Rácselem létrehozásacímű témakörben talál.

Az alábbi XAML az összetett vezérlő TextBox és TextBlock elemeit mutatja be azok RowProperty és ColumnProperty attribútumaival, amelyek úgy vannak beállítva, hogy az elemek megfelelően legyenek elhelyezve a rácsban.

A MyControl1.xaml fájlban adja hozzá a következő XAML-t a Grid elemhez.

  <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"/>

A felhasználói felület elemeinek stílusa

Az adatbeviteli űrlap számos eleme hasonló megjelenésű, ami azt jelenti, hogy több tulajdonságukhoz azonos beállításokat tartalmaznak. Az egyes elemek attribútumainak külön beállítása helyett az előző XAML Style elemeket használ az elemosztályok standard tulajdonságbeállításainak meghatározásához. Ez a megközelítés csökkenti a vezérlő összetettségét, és lehetővé teszi több elem megjelenését egyetlen stílusattribútum használatával.

A Style elemek az Grid elem Resources tulajdonságában találhatók, így a vezérlő összes eleme használhatja őket. Ha egy stílusnak van neve, akkor egy Style elem hozzáadásával alkalmazza azt az elemre. A névvel nem ellátott stílusok lesznek az elem alapértelmezett stílusai. A WPF-stílusokkal kapcsolatos további információkért lásd stílus és sablonozás.

Az alábbi XAML az összetett vezérlőelem Style elemeit mutatja be. A stílusok elemekre való alkalmazásának megtekintéséhez tekintse meg az előző XAML-t. Az utolsó TextBlock elem például inlineText stílust, az utolsó TextBox elem pedig az alapértelmezett stílust használja.

A MyControl1.xaml fájlban adja hozzá a következő XAML-t a Grid kezdőelem után.

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

Az OK és a Mégse gomb hozzáadása

Az összetett vezérlő utolsó elemei az OK és MégseButton elemek, amelyek a Gridutolsó sorának első két oszlopát foglalják el. Ezek az elemek egy gyakori eseménykezelőt, ButtonClickedés az előző XAML-ben definiált alapértelmezett Button stílust használják.

A MyControl1.xaml fájlban adja hozzá a következő XAML-t az utolsó TextBox elem után. Az összetett vezérlő XAML része befejeződött.

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

A Code-Behind fájl implementálása

Az MyControl1.xaml.cs kód mögötti fájl három alapvető feladatot valósít meg:

  1. Kezeli azt az eseményt, amely akkor következik be, amikor a felhasználó az egyik gombra kattint.

  2. Lekéri az adatokat a TextBox elemekből, és egy egyéni eseményargumentum-objektumba csomagolja.

  3. Előhozza az egyéni OnButtonClick eseményt, amely értesíti a gazdagépet, hogy a felhasználó befejeződött, és átadja az adatokat a gazdagépnek.

A vezérlő emellett számos szín- és betűtulajdonságt is elérhetővé tesz, amelyek lehetővé teszik a megjelenés módosítását. A Windows Forms-vezérlők üzemeltetésére használt WindowsFormsHost osztálytól eltérően a ElementHost osztály csak a vezérlő Background tulajdonságát teszi elérhetővé. A kód példája és a Útmutató: Windows Forms összetett vezérlő tárolása a WPF-benpéldája közötti hasonlóság fenntartása érdekében a vezérlő közvetlenül hozzáférhetővé teszi a fennmaradó tulajdonságokat.

A Code-Behind-fájl alapstruktúrája

A kód mögötti fájl egyetlen névtérből áll, MyControls, amely két osztályt, MyControl1 és MyControlEventArgstartalmaz.

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

Az első osztály (MyControl1) egy részleges osztály, amely a MyControl1.xaml-ben definiált felhasználói felület funkcióit megvalósító kódot tartalmazza. A MyControl1.xaml elemzésekor a rendszer az XAML-t ugyanahhoz a részleges osztályhoz alakítja, és a két részleges osztály egyesül a lefordított vezérlő létrehozásához. Ezért a kód mögötti fájl osztálynevének meg kell egyeznie a MyControl1.xaml osztálynévvel, és a vezérlő gyökérelemétől kell örökölnie. A második osztály ( MyControlEventArgs) egy eseményargumentum-osztály, amely az adatoknak a gazdagépnek való visszaküldésére szolgál.

Nyissa meg a MyControl1.xaml.cs. Módosítsa a meglévő osztálydeklarációt úgy, hogy az a következő névvel rendelkezik, és örökölje Grid.

public partial class MyControl1 : Grid

A vezérlő inicializálása

A következő kód számos alapvető feladatot implementál:

  • Deklarál egy privát eseményt, OnButtonClick, és a hozzá tartozó delegáltat, MyControlEventHandler.

  • Több privát globális változót hoz létre, amelyek a felhasználó adatait tárolják. Ezek az adatok a megfelelő tulajdonságokon keresztül lesznek közzétéve.

  • Implementál egy kezelőt Inita vezérlő Loaded eseményéhez. Ez a kezelő inicializálja a globális változókat a MyControl1.xaml-ben definiált értékek hozzárendelésével. Ehhez egy tipikus Name elemhez rendelt TextBlock, nameLabelhasználatával éri el az adott elem tulajdonságbeállításait.

Törölje a meglévő konstruktort, és adja hozzá a következő kódot a MyControl1 osztályhoz.

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;
}

A gombok kattintási eseményeinek kezelése

A felhasználó azt jelzi, hogy az adatbeviteli feladat befejeződött az OK gombra vagy a Mégse gombra kattintva. Mindkét gomb ugyanazt a Click eseménykezelőt használja, ButtonClicked. Mindkét gombnak van egy neve, btnOK vagy btnCancel, amely lehetővé teszi, hogy a kezelő megállapítsa, melyik gombra kattintott a sender argumentum értékének vizsgálatával. A kezelő a következőket végzi el:

  • Létrehoz egy MyControlEventArgs objektumot, amely a TextBox elemekből származó adatokat tartalmazza.

  • Ha a felhasználó a Mégse gombra kattintott, a MyControlEventArgs objektum IsOK tulajdonságát falseértékre állítja.

  • A OnButtonClick-eseményt indítja a gazdagép felé annak jelzésére, hogy a felhasználó befejezte a feladatát, és visszaadja az összegyűjtött adatokat.

Adja hozzá a következő kódot a MyControl1 osztályhoz a Init metódus után.

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);
}

Tulajdonságok létrehozása

Az osztály többi része egyszerűen olyan tulajdonságokat tesz elérhetővé, amelyek megfelelnek a korábban tárgyalt globális változóknak. Ha egy tulajdonság megváltozik, a készlet tartozéka módosítja a vezérlő megjelenését a megfelelő elemtulajdonságok módosításával és az alapul szolgáló globális változók frissítésével.

Adja hozzá a következő kódot a MyControl1 osztályhoz.

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;
    }
}

Az adatok visszaküldése a gazdagépre

A fájl utolsó összetevője a MyControlEventArgs osztály, amely az összegyűjtött adatoknak a gazdagépnek való visszaküldésére szolgál.

Adja hozzá a következő kódot a MyControls névtérhez. A megvalósítás egyszerű, és nem tárgyaljuk tovább.

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; }
    }
}

Hozza létre a megoldást. A build létrehoz egy MyControls.dllnevű DLL-t.

A Windows Forms gazdaprogram implementálása

A Windows Forms gazdaalkalmazás egy ElementHost objektummal üzemelteti a WPF összetett vezérlőt. Az alkalmazás kezeli a OnButtonClick eseményt, hogy megkapja az adatokat az összetett vezérlőből. Az alkalmazás beállításgombokkal is rendelkezik, amelyekkel módosíthatja a vezérlő megjelenését. Az alábbi ábrán az alkalmazás látható.

Az alábbi képen egy Windows Forms-alkalmazásban üzemeltetett WPF-összetett vezérlő látható

Képernyőkép, amely Windows Űrlapot hosztoló Avalon-vezérlőt mutat.

A projekt létrehozása

A projekt indítása:

  1. Indítsa el a Visual Studiót, és nyissa meg az Új projekt párbeszédpanelt.

  2. A Visual C# és a Windows kategóriában válassza a Windows Forms-alkalmazás sablont.

  3. Nevezze el az új projektet WFHost.

  4. A helyhez adja meg ugyanazt a felső szintű mappát, amely a MyControls-projektet tartalmazza.

  5. Kattintson OK gombra a projekt létrehozásához.

A MyControl1-t és más összeállításokat tartalmazó DLL-ekre mutató hivatkozásokat is hozzá kell adnia.

  1. Kattintson a jobb gombbal a projekt nevére a Megoldáskezelőben, és válassza Hivatkozás hozzáadásalehetőséget.

  2. Kattintson a Tallózás fülre, és keresse meg azt a mappát, amely tartalmazza a MyControls.dllelemet. Ebben az útmutatóban ez a mappa a MyControls\bin\Debug.

  3. Válassza MyControls.dll, majd kattintson OKgombra.

  4. Adjon hozzá hivatkozásokat a következő összeállításokhoz.

    • Bemutatómag

    • PresentationFramework

    • System.Xaml

    • WindowsBase

    • WindowsFormsIntegration

Az alkalmazás felhasználói felületének implementálása

A Windows Űrlap alkalmazás felhasználói felülete több vezérlőt tartalmaz a WPF összetett vezérlővel való interakcióhoz.

  1. Nyissa meg a Form1-et a Windows Űrlaptervezőben.

  2. Nagyítsa fel az űrlapot a vezérlők elhelyezéséhez.

  3. Az űrlap jobb felső sarkában adjon hozzá egy System.Windows.Forms.Panel vezérlőelemet a WPF összetett vezérlőelemek befogadására.

  4. Adja hozzá a következő System.Windows.Forms.GroupBox vezérlőket az űrlaphoz.

    Név Szöveg
    CsoportDoboz1 Háttérszín
    CsoportDoboz2 Előtér színe
    csoportdoboz3 Betűméret
    groupBox4 Betűcsalád
    CsoportDoboz5 Betűstílus
    groupBox6 Betűvastagság
    groupBox7 Adatok vezérlésből
  5. Adja hozzá a következő System.Windows.Forms.RadioButton vezérlőket a System.Windows.Forms.GroupBox vezérlőkhöz.

    GroupBox Név Szöveg
    CsoportDoboz1 eredeti rádió háttér Eredeti
    CsoportDoboz1 rádióháttérVilágosZöld Világoszöld
    CsoportDoboz1 radioBackgroundLightSalmon LightSalmon
    CsoportDoboz2 rádióElőtérEredeti Eredeti
    CsoportDoboz2 radioForegroundRed Vörös
    CsoportDoboz2 rádióElőtérSárga Sárga
    csoportdoboz3 eredeti rádióméret Eredeti
    csoportdoboz3 radioSizeTen 10
    csoportdoboz3 radioSizeTwelve 12
    csoportdoboz4 radioFamilyOriginal Eredeti
    groupBox4 Rádió Családi Idők Times New Roman
    CsoportDoboz4 RadioFamilyWingDings Wingdings
    CsoportDoboz5 radioStyleOriginal Normális
    CsoportDoboz5 radioStyleItalic Dőlt
    groupBox6 radioWeightOriginal Eredeti
    groupBox6 radioWeightBold Merész
  6. Adja hozzá a következő System.Windows.Forms.Label vezérlőket az utolsó System.Windows.Forms.GroupBox. Ezek a vezérlők a WPF összetett vezérlő által visszaadott adatokat jelenítik meg.

    GroupBox Név Szöveg
    groupBox7 lblName Név:
    groupBox7 lblAddress Utca és házszám
    groupBox7 lblCity Város:
    groupBox7 lblState Állam:
    groupBox7 lblZip Irányítószám:

Az űrlap inicializálása

Az üzemeltetési kódot általában az űrlap Load eseménykezelőjében implementálja. Az alábbi kód bemutatja a Load eseménykezelőt, a WPF összetett vezérlő Loaded eseményének kezelőjét, valamint a később használt több globális változóhoz tartozó deklarációkat.

A Windows Forms Designerben kattintson duplán az űrlapra egy Load eseménykezelő létrehozásához. A Form1.cs tetején adja hozzá a következő using utasításokat.

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

Cserélje le a meglévő Form1 osztály tartalmát a következő kódra.

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;
}

Az előző kód Form1_Load metódusa a WPF-vezérlők üzemeltetésének általános eljárását mutatja be:

  1. Hozzon létre egy új ElementHost objektumot.

  2. Állítsa a vezérlő Dock tulajdonságát DockStyle.Fillértékre.

  3. Adja hozzá a ElementHost vezérlőt a Panel vezérlő Controls gyűjteményéhez.

  4. Hozza létre a WPF-vezérlő egy példányát.

  5. Annak érdekében, hogy az összetett vezérlőt az űrlapon üzemeltethesse, rendeljen egy vezérlőt a ElementHost vezérlőelem Child tulajdonságához.

A Form1_Load metódus fennmaradó két sora két vezérlőeseményhez csatolja a kezelőket:

  • OnButtonClick egy egyéni esemény, amelyet az összetett vezérlő aktivál, amikor a felhasználó az OK vagy Mégse gombra kattint. Ön kezeli az eseményt a felhasználó válaszának lekéréséhez és a felhasználó által megadott adatok gyűjtéséhez.

  • Loaded egy szabványos esemény, amelyet egy WPF-vezérlő generál, amikor az teljesen betöltődik. Az eseményt azért használja itt a rendszer, mert a példának több globális változót kell inicializálnia a vezérlő tulajdonságainak használatával. Az űrlap Load eseményének időpontjában a vezérlőelem nincs teljesen betöltve, és ezek az értékek továbbra is nullértékre vannak állítva. Meg kell várnia, amíg a vezérlő Loaded eseménye bekövetkezik, mielőtt hozzáférne ezekhez a tulajdonságokhoz.

Az Loaded eseménykezelő az előző kódban jelenik meg. A OnButtonClick kezelőről a következő szakaszban olvashat.

OnButtonClick kezelése

A OnButtonClick esemény akkor következik be, ha a felhasználó az OK vagy Mégse gombra kattint.

Az eseménykezelő ellenőrzi az eseményargumentum IsOK mezőjét annak megállapításához, hogy melyik gombra kattintott. A lbladat- változók megfelelnek a korábban tárgyalt Label vezérlőknek. Ha a felhasználó az OK gombra kattint, a vezérlő TextBox vezérlőinek adatai a megfelelő Label vezérlőelemhez lesznek rendelve. Ha a felhasználó Mégsegombra kattint, a Text értékek az alapértelmezett karakterláncokra állnak vissza.

Adja hozzá az alábbi gombra kattintva az eseménykezelő kódot a Form1 osztályhoz.

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: ";
    }
}

Hozza létre és futtassa az alkalmazást. Adjon hozzá néhány szöveget a WPF összetett vezérlőben, majd kattintson OKgombra. A szöveg megjelenik a címkékben. Ezen a ponton nem adtak hozzá kódot a választógombok kezeléséhez.

A vezérlő megjelenésének módosítása

Az űrlap RadioButton vezérlői lehetővé teszik a felhasználó számára, hogy módosítsa a WPF összetett vezérlő előterét és háttérszínét, valamint számos betűtípus-tulajdonságot. A háttérszínt a ElementHost objektum teszi elérhetővé. A fennmaradó tulajdonságok a vezérlőelem egyéni tulajdonságaiként jelennek meg.

Kattintson duplán az űrlap minden RadioButton vezérlőelemére CheckedChanged eseménykezelők létrehozásához. Cserélje le az CheckedChanged eseménykezelőket a következő kódra.

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;
}

Hozza létre és futtassa az alkalmazást. Kattintson a különböző választógombokra a WPF összetett vezérlőre gyakorolt hatás megtekintéséhez.

Lásd még