İ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ığınızda, var olan 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ılavuz, bir Windows Forms uygulamasında veri girişi gerçekleştirmek için WPF bileşik denetimini barındıran bir uygulamada size yol gösterir. Bileşik denetim bir DLL içinde paketlenmiş. Bu genel yordam daha karmaşık uygulamalara ve denetimlere uzatılabilir. Bu izlenecek yol, İzlenecek Yol: WPF'de Windows Forms Bileşik Denetimi Barındırma ile ilgili görünüm ve işlevsellikte neredeyse aynı olacak şekilde tasarlanmıştır. Birincil fark, barındırma senaryosunun tersine çevrilmiş olmasıdır.

İzlenecek yol iki bölüme ayrılır. İlk bölümde WPF bileşik denetiminin uygulanması kısaca açıklanmaktadır. İkinci bölümde bileşik denetimin bir Windows Forms uygulamasında nasıl barındırılacağı, denetimden olayları alma ve denetimin bazı özelliklerine erişme konuları ayrıntılı olarak ele alınmaktadır.

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

  • WPF bileşik denetimini 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.

Ön koşullar

Bu kılavuzu tamamlamak için Visual Studio'ya ihtiyacınız vardır.

WPF Bileşik Denetimini Uygulama

Bu örnekte kullanılan WPF bileşik denetimi, kullanıcının adını ve adresini alan basit bir veri girişi formudur. Kullanıcı görevin tamamlandığını belirtmek için iki düğmeden birine tıkladığında, denetim bu bilgileri konağa döndürmek için özel bir olay oluşturur. Aşağıdaki çizimde işlenen denetim gösterilmektedir.

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

Screenshot that shows a simple WPF control.

Projeyi Oluşturma

Projeyi başlatmak için:

  1. Visual Studio'yu başlatın ve Yeni Proje iletişim kutusunu açın.

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

  3. Yeni projeyi MyControlsolarak adlandırın.

  4. Konum için, gibi WindowsFormsHostingWpfControluygun bir şekilde adlandırılmış en üst düzey klasör belirtin. Daha sonra konak uygulamasını bu klasöre yerleştireceksiniz.

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

  6. Çözüm Gezgini'da olarak yeniden adlandırın UserControl1MyControl1.

Projenizde aşağıdaki sistem DLL'lerine başvurular bulunmalıdır. Bu DLL'lerden herhangi biri varsayılan olarak dahil değilse, bunları projenize ekleyin.

  • Presentationcore

  • Presentationframework

  • Sistem

  • Windowsbase

Kullanıcı Arabirimi Oluşturma

Bileşik denetimin kullanıcı arabirimi (UI), Genişletilebilir Uygulama biçimlendirme dili (XAML) ile uygulanır. Bileşik denetim kullanıcı arabirimi beş TextBox öğeden oluşur. Her TextBox öğenin etiket işlevi görecek ilişkili TextBlock bir öğesi vardır. Alt kısımda Tamam ve İptal olarak iki Button öğe vardır. Kullanıcı iki düğmeden birini tıklattığında, denetim bilgileri konağa döndürmek için özel bir olay oluşturur.

Temel Düzen

Çeşitli kullanıcı arabirimi öğeleri bir Grid öğede yer alır. Bileşik denetimin içeriğini HTML'de bir Table öğeyi kullandığınız şekilde düzenlemek için kullanabilirsinizGrid. WPF'nin de bir Table öğesi vardır, ancak Grid basit düzen görevleri için daha basit ve daha uygundur.

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

MyControl1.xaml içinde, mevcut XAML'yi 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

Öğenin ve özniteliklerini uygun satır ve ColumnProperty sütun numarasına ayarlayarak bir UI öğesini RowProperty kılavuza yerleştirirsiniz. Satır ve sütun numaralandırmanın sıfır tabanlı olduğunu unutmayın. Özniteliğini ayarlayarak bir öğenin birden çok sütuna yayılmasını ColumnSpanProperty sağlayabilirsiniz. Öğeler hakkında Grid daha fazla bilgi için bkz . Kılavuz Öğesi Oluşturma.

Aşağıdaki XAML, bileşik denetimin TextBox ve TextBlock öğelerini ve öznitelikleriyle RowPropertyColumnProperty birlikte gösterir. Bu öğeler kılavuza düzgün bir şekilde yerleştirecek şekilde ayarlanır.

MyControl1.xaml içinde öğesine 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 Öğelerini Şekillendirme

Veri girişi formundaki öğelerin çoğu benzer bir görünüme sahiptir, bu da özelliklerinin birkaçı için aynı ayarlara sahip oldukları anlamına gelir. Önceki XAML, her öğenin özniteliklerini ayrı ayrı ayarlamak yerine öğeleri kullanarak Style öğe sınıfları için standart özellik ayarlarını tanımlar. Bu yaklaşım denetimin karmaşıklığını azaltır ve tek bir stil özniteliği aracılığıyla birden çok öğe görünümünü değiştirmenize olanak tanır.

Style Öğeler öğenin Resources özelliğinde Grid yer alır, bu nedenle denetimdeki tüm öğeler tarafından kullanılabilir. Bir stil adlandırılmışsa, stilin adına ayarlanmış bir öğe ekleyerek bunu bir Style öğeye uygularsınız. Adlandırılmayan stiller, öğenin varsayılan stili olur. WPF stilleri hakkında daha fazla bilgi için bkz . Stil Oluşturma ve Şablon Oluşturma.

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

MyControl1.xaml'de, start öğesinin hemen arkasına aşağıdaki XAML'yi Grid 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 denetimdeki son öğeler, öğesinin son satırının ilk iki sütununu kaplayan Tamam ve İptalButton öğeleridir Grid. Bu öğeler ortak bir olay işleyicisi, ButtonClickedve önceki XAML'de tanımlanan varsayılan Button stili kullanır.

MyControl1.xaml içinde, son TextBox öğeden sonra aşağıdaki XAML'yi 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>

Arka Planda Kod Dosyasını Uygulama

MyControl1.xaml.cs arka planda kod dosyası üç temel görevi uygular:

  1. Kullanıcı düğmelerden birine tıkladığında gerçekleşen olayı işler.

  2. Öğelerden TextBox verileri alır ve özel bir olay bağımsız değişkeni nesnesinde paketler.

  3. Kullanıcının tamamlandığını konağa bildiren ve verileri konağa geri geçiren özel OnButtonClick olayı oluşturur.

Denetim, görünümü değiştirmenize olanak tanıyan bir dizi renk ve yazı tipi özelliğini de kullanıma sunar. WindowsFormsHost Windows Forms denetimini barındırmak için kullanılan sınıfından ElementHost farklı olarak, sınıfı yalnızca denetimin Background özelliğini kullanıma sunar. Bu kod örneği ile İzlenecek Yol: WPF'de Windows Forms Bileşik Denetimi Barındırma başlığı altında açıklanan örnek arasındaki benzerliği korumak için denetim, kalan özellikleri doğrudan kullanıma sunar.

Arka Planda Kod Dosyasının Temel Yapısı

Arka planda kod dosyası, MyControlsve olmak üzere iki sınıf MyControl1MyControlEventArgsiçeren tek bir ad alanı içerir.

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

birinci sınıf, MyControl1MyControl1.xaml içinde tanımlanan kullanıcı arabiriminin işlevselliğini uygulayan kodu içeren kısmi bir sınıftır. MyControl1.xaml ayrıştırıldığında, 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 plan kod dosyasındaki sınıf adı MyControl1.xaml'e atanan sınıf adıyla eşleşmelidir ve denetimin kök öğesinden devralmalıdır. İkinci sınıf olan MyControlEventArgs, verileri konağa geri göndermek için kullanılan bir olay bağımsız değişkenleri sınıfıdır.

MyControl1.xaml.cs dosyasını açın. Mevcut sınıf bildirimini, aşağıdaki ada sahip olacak ve öğesinden Griddevralan şekilde değiştirin.

public partial class MyControl1 : Grid

Denetimi Başlatma

Aşağıdaki kod birkaç temel görev uygular:

  • özel bir olayı ve OnButtonClickilişkili temsilcisini bildirir MyControlEventHandler.

  • Kullanıcının verilerini depolayan birkaç özel genel değişken oluşturur. Bu veriler ilgili özellikler aracılığıyla kullanıma sunulur.

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

Mevcut oluşturucuyu silin ve sınıfınıza MyControl1 aşağıdaki kodu 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ı İşleme

Kullanıcı, Tamam düğmesine veya İptal 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üğmenin de, btnOK işleyicinin bağımsız değişkenin değerini sender inceleyerek hangi düğmeye tıklandığını belirlemesini sağlayan bir adı veya btnCancelvardır. İşleyici aşağıdakileri yapar:

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

  • Kullanıcı İptal düğmesine tıkladıysa, nesnenin MyControlEventArgsIsOK özelliğini olarak falseayarlar.

  • OnButtonClick Kullanıcının tamamlandığını konağa göstermek için olayı tetikler ve toplanan verileri geri geçirir.

Aşağıdaki kodu yönteminden Init sonra sınıfınıza MyControl1 ekleyin.

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

Özellik Oluşturma

Sınıfın geri kalanı, daha önce ele alınan genel değişkenlere karşılık gelen özellikleri kullanıma sunar. 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 MyControl1 aşağıdaki kodu ekleyin.

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

Verileri Ana Bilgisayara Geri Gönderme

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

Ad alanınıza MyControls aşağıdaki kodu ekleyin. Uygulama basittir ve daha fazla tartışılmaz.

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ü oluşturun. Derleme, MyControls.dll adlı bir DLL oluşturur.

Windows Forms Konak Uygulamasını Uygulama

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

Aşağıdaki görüntüde Bir Windows Forms uygulamasında barındırılan 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'yu başlatın ve Yeni Proje iletişim kutusunu açın.

  2. Visual C# ve Windows kategorisinde Windows Forms Uygulaması şablonunu seçin.

  3. Yeni projeyi WFHostolarak adlandırın.

  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 derlemeleri içeren MyControl1 DLL'ye başvurular eklemeniz gerekir.

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

  2. Gözat sekmesine tıklayın ve MyControls.dll dosyasını içeren klasöre gidin. Bu izlenecek yol için bu klasör MyControls\bin\Debug klasörüdür.

  3. MyControls.dll dosyasını seçip 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ının kullanıcı arabirimi, WPF bileşik denetimiyle etkileşime geçmek için çeşitli denetimler içerir.

  1. Form1'i Windows Form Tasarım Aracı açın.

  2. Formu denetimleri barındıracak şekilde büyütün.

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

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

    Ad Metin
    groupBox1 Arka Plan Rengi
    groupBox2 Ön Plan Rengi
    groupBox3 Yazı Tipi Boyutu
    groupBox4 Yazı Tipi Ailesi
    groupBox5 Yazı Tipi Stili
    groupBox6 Yazı Tipi Kalınlığı
    groupBox7 Denetimden alınan veriler
  5. Denetimlere System.Windows.Forms.GroupBox aşağıdaki System.Windows.Forms.RadioButton denetimleri ekleyin.

    GroupBox Ad Metin
    groupBox1 radioBackgroundOriginal Özgün
    groupBox1 radioBackgroundLightGreen Açık Yeşil
    groupBox1 radioBackgroundLightSalmon LightSalmon
    groupBox2 radioForegroundOriginal Özgün
    groupBox2 radioForegroundRed Kırmızı
    groupBox2 radioForegroundYellow Sarı
    groupBox3 radioSizeOriginal Özgün
    groupBox3 radioSizeTen 10
    groupBox3 radioSizeTwelve 12
    groupBox4 radioFamilyOriginal Özgün
    groupBox4 radioFamilyTimes Times New Roman
    groupBox4 radioFamilyWingDings Wingdings
    groupBox5 radioStyleOriginal Normal
    groupBox5 radioStyleItalic Normal
    groupBox6 radioWeightOriginal Özgün
    groupBox6 radioWeightBold Kalın
  6. Aşağıdaki System.Windows.Forms.Label denetimleri son System.Windows.Forms.GroupBoxöğesine ekleyin. Bu denetimler WPF bileşik denetimi tarafından döndürülen verileri görüntüler.

    GroupBox Ad Metin
    groupBox7 lblName Ad:
    groupBox7 lblAddress Sokak Adresi:
    groupBox7 lblCity Şehir:
    groupBox7 lblState State:
    groupBox7 lblZip Zip:

Formu Başlatma

Barındırma kodunu genellikle formun Load olay işleyicisinde uygularsınız. Aşağıdaki kod olay işleyicisini Load , WPF bileşik denetiminin Loaded olayının işleyicisini ve daha sonra kullanılan çeşitli genel değişkenlerin bildirimlerini gösterir.

Windows Forms Tasarım Aracı, bir olay işleyicisi oluşturmak Load için forma çift tıklayın. Form1.cs dosyasının en üstüne 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_Load Yukarıdaki koddaki yöntemi, WPF denetimini barındırmak için genel yordamı gösterir:

  1. Yeni ElementHost bir nesne oluşturun.

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

  3. Denetimi denetimin ElementHost koleksiyonuna PanelControls ekleyin.

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

  5. Denetimi denetimin özelliğine atayarak bileşik denetimi ElementHost formda barındırın Child .

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

  • OnButtonClick, kullanıcı Tamam veya İptal 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ının belirttiği verileri toplamak için olayı işlersiniz.

  • Loaded , tam olarak yüklendiğinde WPF denetimi tarafından tetiklenen standart bir olaydır. Örneğin denetimden özellikleri 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 yine olarak nullayarlanır. Bu özelliklere erişebilmeniz için denetimin Loaded olayı gerçekleşene kadar beklemeniz gerekir.

Olay Loaded işleyicisi önceki kodda gösterilir. İşleyici OnButtonClick sonraki bölümde açıklanmıştır.

OnButtonClick İşleme

Olay, OnButtonClick kullanıcı Tamam veya İptal düğmesine tıkladığında gerçekleşir.

Olay işleyicisi, hangi düğmeye tıklandığını belirlemek için olay bağımsız değişkeninin IsOK alanını denetler. Veri lbl değişkenleri daha önce açıklanan denetimlere Label karşılık gelir. Kullanıcı Tamam düğmesine tıklarsa, denetimin TextBox denetimlerindeki veriler ilgili Label denetime atanır. Kullanıcı İptal'e tıklarsa, Text değerler varsayılan dizelere ayarlanır.

Aşağıdaki düğmeyi sınıfa olay işleyicisi koduna Form1 tıklayın.

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 metin ekleyin ve tamam'a tıklayın. Metin etiketlerde görünür. Bu noktada, radyo düğmelerini işlemek için kod eklenmemiş.

Denetimin Görünümünü Değiştirme

RadioButton Formdaki denetimler, kullanıcının WPF bileşik denetiminin ön plan ve arka plan renklerinin yanı sıra çeşitli yazı tipi özelliklerini değiştirmesine olanak tanır. Arka plan rengi nesne tarafından ElementHost gösterilir. Kalan özellikler denetimin özel özellikleri olarak sunulur.

Olay işleyicileri oluşturmak CheckedChanged için formdaki her RadioButton denetime çift tıklayın. CheckedChanged Olay 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 denetimi üzerindeki efekti görmek için farklı radyo düğmelerine tıklayın.

Ayrıca bkz.