İzlenecek yol: WPF Bileşik Denetimini Windows Forms İçinde Barındırma

Windows Presentation Foundation (WPF), uygulama oluşturmak için zengin bir ortam sağlar. Ancak, Windows Forms koduna önemli bir yatırım yaptıysanız, mevcut Windows Forms uygulamanızı sıfırdan yeniden yazmak yerine WPF ile genişletmek daha etkili olabilir. Yaygın bir senaryo, Windows Forms uygulamanıza WPF ile uygulanan bir veya daha fazla denetimi eklemek istemenizdir. WPF denetimlerini özelleştirme hakkında daha fazla bilgi için bkz. Denetim Özelleştirmesi.

Bu kılavuzda, Windows Forms uygulamasında veri girişi gerçekleştirmek için WPF bileşik denetimi barındıran bir uygulamada size yol gösterilir. Bileşik denetim bir DLL içinde paketlenmiştir. Bu genel yordam daha karmaşık uygulamalara ve denetimlere genişletilmiş olabilir. Bu izlenecek yol, Görünüm ve işlevsellikte neredeyse aynı olacak şekilde tasarlanmıştır: WPF'de Windows Forms Bileşik Denetimi Barındırma. Temel fark, barındırma senaryosunun tersine çevrilme durumudur.

Kılavuz iki bölüme ayrılmıştır. İlk bölümde WPF bileşik denetimi uygulaması kısaca açık bir şekilde açık bir şekilde anlattır. İkinci bölümde bileşik denetimi bir Windows Forms uygulamasında barındırma, denetimden olayları alma ve denetimin bazı özelliklerine erişme konuları ayrıntılı olarak açıklanmaktadır.

Bu kılavuzda gösterilen görevler şunlardır:

  • WPF bileşik denetimi uygulama.

  • Windows Forms konak uygulamasını uygulama.

Bu kılavuzda gösterilen görevlerin tam kod listesi için bkz. Windows Forms Örneğinde WPF Bileşik Denetimi Barındırma.

Önkoşullar

Bu Visual Studio tamamlamanız gerekir.

WPF Bileşik Denetimi Uygulama

Bu örnekte kullanılan WPF bileşik denetimi, kullanıcının adını ve adresini alan basit bir veri girişi biçimidir. Kullanıcı görevin tamam olduğunu belirtmek için iki düğmeden birini tıkladığında, denetim bu bilgileri ana bilgisayarla geri almak için özel bir olay oluşturabilir. Aşağıdaki çizimde işlenmiş denetim gösterilmiştir.

Aşağıdaki görüntüde WPF bileşik denetimi yer alenidir:

Screenshot that shows a simple WPF control.

Projeyi Oluşturma

Projeyi başlatmak için:

  1. Yeni Visual Studio'ı açın ve Yeni Project iletişim kutusunu açın.

  2. Visual C# ve Windows kategorisinde WPF Kullanıcı Denetimi Kitaplığı şablonunu seçin.

  3. Yeni projeyi olarak ad MyControls girin.

  4. Konum için, gibi rahatça adlandırılmış bir üst düzey klasör WindowsFormsHostingWpfControl belirtin. Daha sonra konak uygulamasını bu klasöre koyacağız.

  5. Projeyi oluşturmak için Tamam'a tıklayın. Varsayılan proje adlı tek bir denetim UserControl1 içerir.

  6. Bu Çözüm Gezgini olarak yeniden UserControl1MyControl1 adlandıryın.

Projenizin aşağıdaki sistem URL'lerine başvuruları olması gerekir. Bu URL'lerden herhangi biri varsayılan olarak dahil değil, bunları projenize ekleyin.

  • Presentationcore

  • Presentationframework

  • Sistem

  • Windowsbase

Kullanıcı Arabirimi

Bileşik denetimin kullanıcı arabirimi (UI), Extensible Application Markup Language (XAML) ile uygulanır. Bileşik denetim kullanıcı arabirimi beş öğeden TextBox oluşur. Her TextBox öğe, etiket olarak TextBlock görev alan ilişkili bir öğeye sahip. Altta, Button Tamam ve İptal olmak için Button öğe vardır. Kullanıcı iki düğmeye tıkladığında denetim, bilgileri ana bilgisayarla birlikte almak için özel bir olay oluşturabilir.

Temel Düzen

Çeşitli kullanıcı arabirimi öğeleri bir öğesinde Grid yer alan. Bileşik Grid denetimin içeriğini HTML'de bir öğeyi kullanmakla aynı şekilde düzenlemek için Table kullanabilirsiniz. WPF'nin de bir Table öğesi vardır, Grid ancak basit düzen görevleri için daha hafif ve daha uygundur.

Aşağıdaki XAML temel düzeni gösterir. Bu XAML, öğesinde sütun ve satır sayısını belirterek denetimin genel yapısını Grid tanımlar.

MyControl1.xaml içinde mevcut XAML'i aşağıdaki XAML ile değiştirin.

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

Kılavuza TextBlock ve TextBox Öğeleri Ekleme

Öğesinin ve özniteliklerini uygun satır ve sütun numarasına ayarlıyorsanız, kılavuza bir kullanıcı RowPropertyColumnProperty arabirimi öğesi yer alıyor. Satır ve sütun sayılamanın sıfır tabanlı olduğunu unutmayın. Özniteliğini ayar olarak bir öğenin birden çok sütuna yaymasını ColumnSpanProperty sekleyebilirsiniz. Öğeler hakkında daha fazla Grid bilgi için Grid

Aşağıdaki XAML, bileşik denetimin ve öğelerini ve öznitelikleriyle gösterir. Bunlar, öğeleri kılavuza düzgün TextBox bir şekilde yer alan şekilde TextBlockRowPropertyColumnProperty ayarlanmıştır.

MyControl1.xaml içinde öğesinin içinde aşağıdaki XAML'yi Grid ekleyin.

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

Kullanıcı Arabirimi Öğelerinde Stil Oluşturma

Veri girişi formundaki öğelerin çoğu benzer bir görünüme sahiptir ve bu da özelliklerinin birkaçı için aynı ayarlara sahip olduklarını gösterir. Önceki XAML, her öğenin özniteliklerini ayrı olarak ayarlama yerine öğe sınıfları için Style standart özellik ayarlarını tanımlamak üzere öğeleri kullanır. Bu yaklaşım denetimin karmaşıklığını azaltır ve tek bir stil özniteliği aracılığıyla birden çok öğenin görünümünü değiştirmenizi sağlar.

StyleÖğeler, öğenin Grid özelliğinde yer Resources alan bu nedenle denetimdeki tüm öğeler tarafından kullanılabilir. Bir stil adlandırılmışsa, stilin adına ayarlanmış bir öğe ekleyerek Style bunu bir öğeye uygulayabilirsiniz. Adlı değil stilleri öğe için varsayılan stil haline gelir. WPF stilleri hakkında daha fazla bilgi için bkz. Stil Oluşturma ve Oluşturma.

Aşağıdaki XAML bileşik Style denetimin öğelerini gösterir. Stillerin öğelere nasıl uygulandığını görmek için önceki XAML'ye bakın. Örneğin, son TextBlock öğe inlineText stiline sahiptir ve son TextBox öğe varsayılan stili kullanır.

MyControl1.xaml içinde, start öğesinde hemen sonra aşağıdaki Grid XAML'yi ekleyin.

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

Tamam ve İptal Düğmelerini Ekleme

Bileşik denetimde son öğeler, sonsatırın ilk iki sütunlarını kaplayacak Tamam ve İptal öğeleridir. Bu öğeler ortak bir olay işleyicisi, ButtonClicked ve önceki Button XAML'de tanımlanan varsayılan stili kullanır.

MyControl1.xaml içinde, son öğeden sonra aşağıdaki XAML'yi TextBox ekleyin. Bileşik denetimin XAML bölümü artık tamamlandı.

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

Code-Behind Dosyası Uygulama

MyControl1.xaml.cs kod arkalı kod dosyası üç temel görevi uygulamaya almaktadır:

  1. Kullanıcı düğmelerden birini tıkladığında oluşan olayı işler.

  2. Öğelerinden verileri alan TextBox ve özel bir olay bağımsız değişken nesnesi içinde paketler.

  3. Özel olayı, kullanıcıya kullanıcının tamam olduğunu haber veren ve verileri yeniden ana OnButtonClick bilgisayarla birlikte iletir.

Denetim ayrıca görünümü değiştirmenizi sağlayan bir dizi renk ve yazı tipi özelliği de gösterir. Bir Windows Forms denetimi barındırmak için kullanılan sınıfından farklı olarak, sınıfı WindowsFormsHostElementHost yalnızca denetimin özelliğini ortaya Background çıkarır. Bu kod örneği ile Kılavuz: WPF'de Windows FormsBileşik Denetimi Barındırma'da ele alan örnek arasındaki benzerliği korumak için, denetim kalan özellikleri doğrudan gösterir.

Code-Behind Dosyasının Temel Yapısı

Arkadan kod dosyası, ve olmak için iki sınıf MyControls içeren tek bir ad alanı MyControl1MyControlEventArgs içerir.

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

birinci sınıf olan , MyControl1.xaml içinde tanımlanan kullanıcı arabiriminin işlevselliğini uygulayan kodu içeren kısmi MyControl1 bir sınıftır. MyControl1.xaml ayrıştırıldı, XAML aynı kısmi sınıfa dönüştürülür ve iki kısmi sınıf derlenmiş denetimi oluşturmak için birleştirilir. Bu nedenle, arka arkasındaki kod dosyasındaki sınıf adı MyControl1.xaml'e atanan sınıf adıyla eşleşmeli ve denetimin kök öğesinden devralınması gerekir. İkinci sınıf olan MyControlEventArgs , verileri ana bilgisayarlarına geri göndermek için kullanılan bir olay bağımsız değişkenleri sınıfıdır.

MyControl1.xaml.cs'yi açın. Var olan sınıf bildirimini, aşağıdaki adla değiştir ve 'den Grid devralın.

public partial class MyControl1 : Grid

Denetimi Başlatma

Aşağıdaki kod birkaç temel görevi uygulamaya almaktadır:

  • Özel bir olayı ve OnButtonClick ilişkili temsilcisini ( ) bildirer. MyControlEventHandler

  • Kullanıcının verilerini depolarken birkaç özel genel değişken oluşturur. Bu veriler ilgili özellikler aracılığıyla ortaya çıkar.

  • Denetimin olayı için Init bir işleyicisi ( ) Loaded uygulama. Bu işleyici, MyControl1. xaml içinde tanımlanan değerleri atayarak genel değişkenleri başlatır. Bunu yapmak için, bu NameTextBlocknameLabel öğenin özellik ayarlarına erişmek için tipik bir öğesine atanan ' ı kullanır.

Mevcut oluşturucuyu silin ve aşağıdaki kodu MyControl1 sınıfınıza ekleyin.

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

Düğmelerin tıklama olaylarını işleme

Kullanıcı, Tamam düğmesine veya iptal düğmesine tıklayarak veri girişi görevinin tamamlandığını gösterir. Her iki düğme de aynı Click olay işleyicisini kullanır ButtonClicked . Her iki düğme de bir ada btnOK sahiptir btnCancel . Bu, işleyicinin bağımsız değişkenin değerini inceleyerek hangi düğmenin tıklandığını belirlemesine olanak sağlar sender . İşleyici şunları yapar:

  • MyControlEventArgsÖğelerden verileri içeren bir nesne oluşturur TextBox .

  • Kullanıcı iptal düğmesine tıkladıysanız nesnenin IsOK özelliğini olarak ayarlar false .

  • , OnButtonClick Kullanıcının tamamlandığını ana bilgisayara göstermek için olayı başlatır ve toplanan verileri geri geçirir.

MyControl1Yönteminden sonra Sınıfınıza aşağıdaki kodu ekleyin Init .

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

Özellikler oluşturma

Sınıfın geri kalanı, daha önce ele alınan genel değişkenlere karşılık gelen özellikleri gösterir. Bir özellik değiştiğinde, küme erişimcisi ilgili öğe özelliklerini değiştirerek ve temel alınan genel değişkenleri güncelleştirerek denetimin görünümünü değiştirir.

Sınıfınıza aşağıdaki kodu ekleyin 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;
    }
}

Veriler konağa geri gönderiliyor

Dosyadaki son bileşen, MyControlEventArgs toplanan verileri konağa geri göndermek için kullanılan sınıftır.

Aşağıdaki kodu MyControls ad alanına ekleyin. Uygulama basittir ve daha fazla açıklanmaz.

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

Çözümü derleyin. Yapı MyControls.dll adlı bir DLL oluşturur.

Windows Forms ana bilgisayar uygulamasını uygulama

Windows Forms ana bilgisayar uygulaması ElementHost WPF bileşik denetimini barındırmak için bir nesne kullanır. Uygulama, OnButtonClick bileşik denetimden verileri almak için olayı işler. Uygulamanın Ayrıca, denetimin görünümünü değiştirmek için kullanabileceğiniz bir seçenek düğmeleri kümesi vardır. Aşağıdaki çizimde uygulama gösterilmektedir.

aşağıdaki görüntüde Windows Forms uygulamasında barındırılan bir WPF bileşik denetimi gösterilmektedir

Screenshot that shows a Windows Form Hosting Avalon control.

Projeyi Oluşturma

Projeyi başlatmak için:

  1. Visual Studio başlatın ve yeni Project iletişim kutusunu açın.

  2. Visual C# ve Windows kategorisinde, Windows Forms uygulama şablonunu seçin.

  3. Yeni projeyi adlandırın WFHost .

  4. Konum için, MyControls projesini içeren en üst düzey klasörü belirtin.

  5. Projeyi oluşturmak için Tamam'a tıklayın.

Ayrıca, ve diğer derlemeler içeren DLL 'ye başvurular eklemeniz gerekir MyControl1 .

  1. Çözüm Gezgini ' de proje adına sağ tıklayın ve Başvuru Ekle' yi seçin.

  2. Araştır sekmesine tıklayın ve MyControls.dll içeren klasöre gidin. Bu izlenecek yol için, bu klasör Mycontrols\bin\debugklasörüdür.

  3. MyControls.dll öğesini seçin ve ardından Tamam' a tıklayın.

  4. Aşağıdaki derlemelere başvurular ekleyin.

    • PresentationCore

    • PresentationFramework

    • System. xaml

    • WindowsBase

    • WindowsFormsIntegration

Uygulama için Kullanıcı arabirimini uygulama

Windows Form uygulaması için kullanıcı arabirimi, WPF bileşik denetimiyle etkileşim kurmak için çeşitli denetimler içerir.

  1. Windows Form tasarımcısında Form1 ' i açın.

  2. Form, denetimleri kapsayacak şekilde büyütün.

  3. Formun sağ üst köşesinde, System.Windows.Forms.Panel WPF bileşik denetimini tutmak için bir denetim ekleyin.

  4. System.Windows.Forms.GroupBoxForma aşağıdaki denetimleri ekleyin.

    Name Metin
    groupBox1 Arka Plan Rengi
    groupBox2 Ön plan rengi
    groupBox3 Yazı tipi boyutu
    groupBox4 Yazı tipi ailesi
    groupBox5 Yazı tipi stili
    groupBox6 Yazı tipi ağırlığı
    groupBox7 Denetimdeki veriler
  5. System.Windows.Forms.RadioButtonDenetimlere aşağıdaki denetimleri ekleyin System.Windows.Forms.GroupBox .

    GroupBox Name Metin
    groupBox1 radioBackgroundOriginal Özgün
    groupBox1 radioBackgroundLightGreen Açık yeşil
    groupBox1 radioBackgroundLightSalmon Açık somon
    groupBox2 radioForegroundOriginal Özgün
    groupBox2 radioForegroundRed Kırmızı
    groupBox2 radioForegroundYellow Yellow
    groupBox3 radioSizeOriginal Özgün
    groupBox3 radioSizeTen 10
    groupBox3 radioSizeTwelve 12
    groupBox4 radioFamilyOriginal Özgün
    groupBox4 Radiofamili Times New Roman
    groupBox4 Radiofamilswingdings Simgesine
    groupBox5 radioStyleOriginal Normal
    groupBox5 radioStyleItalic İtalik
    groupBox6 radioWeightOriginal Özgün
    groupBox6 radioWeightBold Kalın
  6. Son ' a aşağıdaki System.Windows.Forms.Label denetimleri ekleyin System.Windows.Forms.GroupBox . Bu denetimler WPF bileşik denetimi tarafından döndürülen verileri görüntüler.

    GroupBox Name Metin
    groupBox7 lblName Ad:
    groupBox7 lblAddress Sokak adresi:
    groupBox7 lblCity Baş
    groupBox7 lblState Durumunda
    groupBox7 lblZip Zip

Form başlatılıyor

Genellikle barındırma kodunu formun Load olay işleyicisine uygulayamazsınız. Aşağıdaki kod, Load olay işleyicisini, WPF bileşik denetiminin olayına yönelik bir işleyiciyi Loaded ve daha sonra kullanılan çeşitli genel değişkenlerin bildirimlerini gösterir.

Windows Form Tasarımcısı, bir olay işleyicisi oluşturmak için forma çift tıklayın Load . Form1. cs ' nin en üstünde aşağıdaki using deyimleri ekleyin.

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

Mevcut Form1 sınıfın içeriğini aşağıdaki kodla değiştirin.

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

Form1_LoadYukarıdaki kodda YÖNTEMI WPF denetimini barındırmak için genel prosedürü gösterir:

  1. Yeni bir ElementHost nesne oluşturun.

  2. Denetimin Dock özelliğini olarak ayarlayın DockStyle.Fill .

  3. Denetimi denetimin ElementHostPanelControls koleksiyonuna ekleyin.

  4. WPF denetiminin bir örneğini oluşturun.

  5. Denetimi denetimin özelliğine atayarak bileşik denetimi form üzerinde barındırın ElementHostChild .

Yöntemdeki kalan iki satır, Form1_Load işleyicileri iki denetim olayına ekler:

  • OnButtonClick Kullanıcı OnButtonClick veya iptal düğmesine tıkladığında bileşik denetim tarafından tetiklenen özel bir olaydır. Kullanıcının yanıtını almak ve Kullanıcı tarafından belirtilen verileri toplamak için olayını işleyebilirsiniz.

  • Loaded , tam olarak yüklendiğinde WPF denetimi tarafından oluşturulan standart bir olaydır. Örnek, denetimin özelliklerini kullanarak birkaç genel değişken başlatması gerektiğinden olay burada kullanılır. Formun Load olayı sırasında, denetim tam olarak yüklenmez ve bu değerler olarak ayarlanır null . LoadedBu özelliklere erişebilmek için denetimin olayının gerçekleşene kadar beklemeniz gerekir.

LoadedOlay işleyicisi önceki kodda gösterilmiştir. OnButtonClickİşleyici, sonraki bölümde ele alınmıştır.

OnButtonClick işleme

OnButtonClickKullanıcı OnButtonClick veya iptal düğmesine tıkladığında olay oluşur.

Olay işleyicisi, IsOK hangi düğmenin tıklandığını belirleyen olay bağımsız değişkeninin alanını denetler. lbllbl değişkenleri, Label daha önce ele alınan denetimlere karşılık gelir. Kullanıcı Tamam düğmesine tıkladığında, denetimin denetimlerindeki veriler ilgili Label denetime atanır. Kullanıcı iptal' i tıklarsa, değerler varsayılan dizelere ayarlanır.

Aşağıdaki düğmeye tıklayarak sınıfına olay işleyicisi kodu ekleyin Form1 .

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

Uygulamayı derleyin ve çalıştırın. WPF bileşik denetimine biraz metin ekleyin ve ardından Tamam' a tıklayın. Metin, etiketlerde görüntülenir. Bu noktada radyo düğmelerini işlemek için kod eklenmedi.

Denetimin görünümünü değiştirme

RadioButtonFormdaki denetimler, kullanıcının WPF bileşik denetiminin ön plan ve arka plan renklerini ve çeşitli yazı tipi özelliklerini değiştirmesine olanak sağlar. Arka plan rengi nesnesi tarafından gösterilir ElementHost . Kalan özellikler, denetimin özel özellikleri olarak gösterilir.

RadioButtonOlay işleyicileri oluşturmak için formdaki her denetime çift tıklayın CheckedChanged . CheckedChangedOlay işleyicilerini aşağıdaki kodla değiştirin.

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

Uygulamayı derleyin ve çalıştırın. WPF bileşik denetimindeki etkiyi görmek için farklı radyo düğmelerine tıklayın.

Ayrıca bkz.