Bagikan melalui


Langkah-langkah: Menghosting Kontrol Komposit Formulir Windows di WPF

Windows Presentation Foundation (WPF) menyediakan lingkungan yang kaya untuk membuat aplikasi. Namun, ketika Anda memiliki investasi besar dalam kode Windows Forms, bisa lebih efektif untuk menggunakan kembali setidaknya beberapa kode itu di aplikasi WPF Anda daripada menulis ulang dari awal. Skenario yang paling umum adalah ketika Anda memiliki kontrol Windows Forms yang ada. Dalam beberapa kasus, Anda bahkan mungkin tidak memiliki akses ke kode sumber untuk kontrol ini. WPF menyediakan prosedur mudah untuk menghosting kontrol tersebut dalam aplikasi WPF. Misalnya, Anda dapat menggunakan WPF untuk sebagian besar pemrograman Anda saat menghosting kontrol DataGridView khusus Anda.

Panduan ini memandu Anda melalui aplikasi yang menghosting kontrol komposit Formulir Windows untuk melakukan entri data dalam aplikasi WPF. Kontrol komposit dikemas dalam DLL. Prosedur umum ini dapat diperluas ke aplikasi dan kontrol yang lebih kompleks. Panduan ini dirancang agar tampilan dan fungsinya nyaris sama dengan Walkthrough: menghosting kontrol komposit WPF di Windows Forms. Perbedaan utamanya adalah bahwa skenario hostingnya terbalik.

Panduan dibagi menjadi dua bagian. Bagian pertama secara singkat menjelaskan implementasi kontrol komposit Windows Forms. Bagian kedua membahas secara rinci cara menghosting kontrol komposit dalam aplikasi WPF, menerima peristiwa dari kontrol, dan mengakses beberapa properti kontrol.

Tugas yang diilustrasikan dalam panduan ini meliputi:

  • Menerapkan kontrol komposit pada Formulir Windows.

  • Menerapkan aplikasi host WPF.

Untuk daftar kode lengkap tugas yang diilustrasikan dalam panduan ini, lihat Menghosting Kontrol Komposit Formulir Windows dalam Sampel WPF.

Prasyarat

Anda memerlukan Visual Studio untuk menyelesaikan panduan ini.

Menerapkan Komposit Kontrol Windows Forms

Kontrol komposit Windows Forms yang digunakan dalam contoh ini adalah formulir entri data sederhana. Formulir ini mengambil nama dan alamat pengguna lalu menggunakan peristiwa kustom untuk mengembalikan informasi tersebut ke host. Ilustrasi berikut menunjukkan kontrol yang telah dihasilkan.

Gambar berikut menunjukkan kontrol komposit Formulir Windows:

Cuplikan layar yang memperlihatkan kontrol Windows Forms sederhana.

Membuat Proyek

Untuk memulai proyek:

  1. Luncurkan Visual Studio, dan buka kotak dialog Proyek Baru.

  2. Di kategori Jendela, pilih templat Pustaka Kontrol Windows Forms.

  3. Beri nama proyek baru MyControls.

  4. Untuk lokasi, tentukan folder tingkat atas dengan nama yang nyaman, seperti WpfHostingWindowsFormsControl. Nantinya, Anda akan menempatkan aplikasi host di folder ini.

  5. Klik OK untuk membuat proyek. Proyek default berisi kontrol tunggal bernama UserControl1.

  6. Di Penjelajah Solusi, ganti nama UserControl1 menjadi MyControl1.

Proyek Anda harus memiliki referensi ke DLL sistem berikut. Jika salah satu DLL ini tidak disertakan secara default, tambahkan ke proyek.

  • Sistem

  • System.Data

  • System.Drawing

  • System.Windows.Forms

  • System.Xml

Menambahkan Kontrol ke Formulir

Untuk menambahkan kontrol ke formulir:

  • Buka MyControl1 di perancang.

Tambahkan lima kontrol Label dan kontrol TextBox yang sesuai, berukuran dan disusun seperti yang ada dalam ilustrasi sebelumnya, pada formulir. Dalam contoh, kontrol TextBox diberi nama:

  • txtName

  • txtAddress

  • txtCity

  • txtState

  • txtZip

Tambahkan dua kontrol Button berlabel OK dan Batalkan. Dalam contoh, nama tombol masing-masing btnOK dan btnCancel.

Menerapkan Kode Pendukung

Buka formulir dalam tampilan kode. Kontrol mengembalikan data yang dikumpulkan ke hostnya dengan memicu peristiwa kustom OnButtonClick. Data terkandung dalam objek argumen peristiwa. Kode berikut menunjukkan acara dan deklarasi delegasi.

Tambahkan kode berikut ke kelas MyControl1.

public delegate void MyControlEventHandler(object sender, MyControlEventArgs args);
public event MyControlEventHandler OnButtonClick;
Public Delegate Sub MyControlEventHandler(ByVal sender As Object, ByVal args As MyControlEventArgs)
Public Event OnButtonClick As MyControlEventHandler

Kelas MyControlEventArgs berisi informasi yang akan dikembalikan ke host.

Tambahkan kelas berikut ke formulir.

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; }
    }
}
Public Class MyControlEventArgs
    Inherits EventArgs
    Private _Name As String
    Private _StreetAddress As String
    Private _City As String
    Private _State As String
    Private _Zip As String
    Private _IsOK As Boolean
    
    
    Public Sub New(ByVal result As Boolean, ByVal name As String, ByVal address As String, ByVal city As String, ByVal state As String, ByVal zip As String) 
        _IsOK = result
        _Name = name
        _StreetAddress = address
        _City = city
        _State = state
        _Zip = zip
    
    End Sub
    
    
    Public Property MyName() As String 
        Get
            Return _Name
        End Get
        Set
            _Name = value
        End Set
    End Property
    
    Public Property MyStreetAddress() As String 
        Get
            Return _StreetAddress
        End Get
        Set
            _StreetAddress = value
        End Set
    End Property
    
    Public Property MyCity() As String 
        Get
            Return _City
        End Get
        Set
            _City = value
        End Set
    End Property
    
    Public Property MyState() As String 
        Get
            Return _State
        End Get
        Set
            _State = value
        End Set
    End Property
    
    Public Property MyZip() As String 
        Get
            Return _Zip
        End Get
        Set
            _Zip = value
        End Set
    End Property
    
    Public Property IsOK() As Boolean 
        Get
            Return _IsOK
        End Get
        Set
            _IsOK = value
        End Set
    End Property
End Class

Saat pengguna mengklik tombol OK atau Batalkan, penanganan aktivitas Click membuat objek MyControlEventArgs yang berisi data dan menaikkan peristiwa OnButtonClick. Satu-satunya perbedaan antara kedua handler adalah properti IsOK dari argumen event. Properti ini memungkinkan host untuk menentukan tombol mana yang diklik. Ini diatur ke true untuk tombol OK, dan false untuk tombol Batalkan. Kode berikut menunjukkan dua handler tombol.

Tambahkan kode berikut ke kelas MyControl1.

private void btnOK_Click(object sender, System.EventArgs e)
{

    MyControlEventArgs retvals = new MyControlEventArgs(true,
                                                         txtName.Text,
                                                         txtAddress.Text,
                                                         txtCity.Text,
                                                         txtState.Text,
                                                         txtZip.Text);
    OnButtonClick(this, retvals);
}

private void btnCancel_Click(object sender, System.EventArgs e)
{
    MyControlEventArgs retvals = new MyControlEventArgs(false,
                                                         txtName.Text,
                                                         txtAddress.Text,
                                                         txtCity.Text,
                                                         txtState.Text,
                                                         txtZip.Text);
    OnButtonClick(this, retvals);
}
Private Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click

    Dim retvals As New MyControlEventArgs(True, txtName.Text, txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text)
    RaiseEvent OnButtonClick(Me, retvals)

End Sub

Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click
    Dim retvals As New MyControlEventArgs(False, txtName.Text, txtAddress.Text, txtCity.Text, txtState.Text, txtZip.Text)
    RaiseEvent OnButtonClick(Me, retvals)

End Sub

Memberikan Nama Kuat pada Majelis dan Membangun Majelis

Agar rakitan ini dirujuk oleh aplikasi WPF, itu harus memiliki nama yang kuat. Untuk membuat nama yang kuat, buat file kunci dengan Sn.exe dan tambahkan ke proyek Anda.

  1. Buka perintah Visual Studio. Untuk melakukannya, klik menu Mulai, lalu pilih Semua Program/Microsoft Visual Studio 2010/Visual Studio Tools/Visual Studio Command Prompt. Ini meluncurkan jendela konsol dengan variabel lingkungan yang disesuaikan.

  2. Pada prompt perintah, gunakan perintah cd untuk masuk ke folder proyek Anda.

  3. Buat file kunci bernama MyControls.snk dengan menjalankan perintah berikut.

    Sn.exe -k MyControls.snk
    
  4. Untuk menyertakan file kunci dalam proyek Anda, klik kanan nama proyek di Penjelajah Solusi lalu klik properti . Di Perancang Proyek, klik tab Penandatanganan, pilih kotak centang Tanda tangani rakitan lalu cari file kunci Anda.

  5. Bangun solusinya. Build akan menghasilkan DLL bernama MyControls.dll.

Menerapkan Aplikasi Host WPF

Aplikasi host WPF menggunakan kontrol WindowsFormsHost untuk menghosting MyControl1. Aplikasi menangani peristiwa OnButtonClick untuk menerima data dari kontrol. Ini juga memiliki kumpulan tombol opsi yang memungkinkan Anda mengubah beberapa properti kontrol dari aplikasi WPF. Ilustrasi berikut menunjukkan aplikasi yang sudah selesai.

Gambar berikut menunjukkan aplikasi lengkap, termasuk kontrol yang disematkan dalam aplikasi WPF:

Cuplikan layar yang memperlihatkan kontrol yang disematkan di halaman WPF.

Membuat Proyek

Untuk memulai proyek:

  1. Buka Visual Studio, dan pilih Proyek Baru.

  2. Dalam kategori Jendela, pilih templat Aplikasi WPF.

  3. Beri nama proyek baru WpfHost.

  4. Untuk lokasi, tentukan folder tingkat atas yang sama yang berisi proyek MyControls.

  5. Klik OK untuk membuat proyek.

Anda juga perlu menambahkan referensi ke DLL yang berisi MyControl1 dan komponen lainnya.

  1. Klik kanan nama proyek di Penjelajah Solusi dan pilih Tambahkan Referensi.

  2. Klik tab Telusuri, dan telusuri ke folder yang berisi MyControls.dll. Untuk panduan ini, folder ini adalah MyControls\bin\Debug.

  3. Pilih MyControls.dll, lalu klik OK.

  4. Tambahkan referensi ke rakitan WindowsFormsIntegration, yang diberi nama WindowsFormsIntegration.dll.

Menerapkan Tata Letak Dasar

Antarmuka pengguna (UI) aplikasi host diimplementasikan di MainWindow.xaml. File ini berisi markup Extensible Application Markup Language (XAML) yang menentukan tata letak, dan menghosting kontrol Windows Forms. Aplikasi ini dibagi menjadi tiga wilayah:

  • Panel Properti Kontrol , yang berisi kumpulan tombol opsi yang dapat Anda gunakan untuk memodifikasi berbagai properti dari kontrol yang dihosting.

  • Data dari panel Kontrol, yang berisi beberapa elemen TextBlock yang menampilkan data yang dikembalikan dari kontrol host.

  • Kontrol yang dihosting itu sendiri.

Tata letak dasar diperlihatkan dalam XAML berikut. Markup yang diperlukan untuk menghosting MyControl1 dihilangkan dari contoh ini, tetapi akan dibahas nanti.

Ganti XAML di MainWindow.xaml dengan yang berikut ini. Jika Anda menggunakan Visual Basic, ubah kelas menjadi x:Class="MainWindow".

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="WpfHost.MainWindow"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">
  <DockPanel>
    <DockPanel.Resources>
      <Style x:Key="inlineText" TargetType="{x:Type Inline}">
        <Setter Property="FontWeight" Value="Normal"/>
      </Style>
      <Style x:Key="titleText" TargetType="{x:Type TextBlock}">
        <Setter Property="DockPanel.Dock" Value="Top"/>
        <Setter Property="FontWeight" Value="Bold"/>
        <Setter Property="Margin" Value="10,5,10,0"/>
      </Style>
    </DockPanel.Resources>

    <StackPanel Orientation="Vertical"
                DockPanel.Dock="Left"
                Background="Bisque"
                Width="250">

      <TextBlock  Margin="10,10,10,10"
                  FontWeight="Bold"
                  FontSize="12">Control Properties</TextBlock>
      <TextBlock Style="{StaticResource titleText}">Background Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalBackColor"
                    IsChecked="True"
                    Click="BackColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnBackGreen"
                    Click="BackColorChanged">LightGreen</RadioButton>
        <RadioButton Name="rdbtnBackSalmon"
                    Click="BackColorChanged">LightSalmon</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Foreground Color</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalForeColor"
                    IsChecked="True"
                    Click="ForeColorChanged">Original</RadioButton>
        <RadioButton Name="rdbtnForeRed"
                    Click="ForeColorChanged">Red</RadioButton>
        <RadioButton Name="rdbtnForeYellow"
                    Click="ForeColorChanged">Yellow</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Family</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalFamily"
                     IsChecked="True"
                    Click="FontChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTimes"
                    Click="FontChanged">Times New Roman</RadioButton>
        <RadioButton Name="rdbtnWingdings"
                    Click="FontChanged">Wingdings</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Size</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalSize"
                    IsChecked="True"
                    Click="FontSizeChanged">Original</RadioButton>
        <RadioButton Name="rdbtnTen"
                    Click="FontSizeChanged">10</RadioButton>
        <RadioButton Name="rdbtnTwelve"
                    Click="FontSizeChanged">12</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Style</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnNormalStyle"
                     IsChecked="True"
                     Click="StyleChanged">Original</RadioButton>
        <RadioButton Name="rdbtnItalic"
                     Click="StyleChanged">Italic</RadioButton>
      </StackPanel>

      <TextBlock Style="{StaticResource titleText}">Font Weight</TextBlock>
      <StackPanel Margin="10,10,10,10">
        <RadioButton Name="rdbtnOriginalWeight"
                     IsChecked="True"
                   Click="WeightChanged">
          Original
        </RadioButton>
        <RadioButton Name="rdbtnBold"
                   Click="WeightChanged">Bold</RadioButton>
      </StackPanel>
    </StackPanel>

    <WindowsFormsHost Name="wfh"
                     DockPanel.Dock="Top"
                     Height="300">
      <mcl:MyControl1 Name="mc"/>
    </WindowsFormsHost>
    
    <StackPanel Orientation="Vertical"
                Height="Auto"
                Background="LightBlue">
      <TextBlock Margin="10,10,10,10"
            FontWeight="Bold"
            FontSize="12">Data From Control</TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Name: <Span Name="txtName" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Street Address: <Span Name="txtAddress" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        City: <Span Name="txtCity" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        State: <Span Name="txtState" Style="{StaticResource inlineText}"/>
      </TextBlock>
      <TextBlock Style="{StaticResource titleText}">
        Zip: <Span Name="txtZip" Style="{StaticResource inlineText}"/>
      </TextBlock>
    </StackPanel>
  </DockPanel>
</Window>

Elemen StackPanel pertama berisi beberapa set kontrol RadioButton yang memungkinkan Anda mengubah berbagai properti default kontrol yang dihosting. Itu diikuti oleh elemen WindowsFormsHost, yang menghosting MyControl1. Elemen StackPanel akhir berisi beberapa elemen TextBlock yang menampilkan data yang dikembalikan oleh kontrol yang dihosting. Pengurutan elemen dan pengaturan atribut Dock dan Height menyematkan kontrol yang dihosting ke jendela tanpa celah atau distorsi.

Hosting Panel Kontrol

Versi XAML sebelumnya yang diedit berikut berfokus pada elemen yang diperlukan untuk menghosting MyControl1.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      x:Class="WpfHost.MainWindow"
      xmlns:mcl="clr-namespace:MyControls;assembly=MyControls"
      Loaded="Init">
<WindowsFormsHost Name="wfh"
                 DockPanel.Dock="Top"
                 Height="300">
  <mcl:MyControl1 Name="mc"/>
</WindowsFormsHost>

Atribut pemetaan namespace xmlns membuat referensi ke namespace MyControls yang berisi kontrol yang dihosting. Pemetaan ini memungkinkan Anda untuk mewakili MyControl1 di XAML sebagai <mcl:MyControl1>.

Dua elemen dalam XAML menangani hosting:

  • WindowsFormsHost mewakili elemen WindowsFormsHost yang memungkinkan Anda menghosting kontrol Formulir Windows dalam aplikasi WPF.

  • mcl:MyControl1, yang mewakili MyControl1, ditambahkan ke koleksi anak elemen WindowsFormsHost. Akibatnya, kontrol Windows Forms ini dirender sebagai bagian dari jendela WPF, dan Anda dapat berkomunikasi dengan kontrol dari aplikasi.

Menerapkan File Code-Behind

File code-behind, MainWindow.xaml.vb atau MainWindow.xaml.cs, berisi kode prosedural yang mengimplementasikan fungsionalitas UI yang dibahas di bagian sebelumnya. Tugas utamanya adalah:

  • Melampirkan penanganan aktivitas ke peristiwa MyControl1OnButtonClick.

  • Memodifikasi berbagai properti dari MyControl1berdasarkan pengaturan kumpulan tombol opsi.

  • Menampilkan data yang dikumpulkan oleh kontrol.

Menginisialisasi Aplikasi

Kode inisialisasi terkandung dalam pengendali acara untuk peristiwa Loaded pada jendela dan mengikatkan pengendali acara ke peristiwa OnButtonClick pada kontrol.

Di MainWindow.xaml.vb atau MainWindow.xaml.cs, tambahkan kode berikut ke kelas MainWindow.

private Application app;
private Window myWindow;
FontWeight initFontWeight;
Double initFontSize;
FontStyle initFontStyle;
SolidColorBrush initBackBrush;
SolidColorBrush initForeBrush;
FontFamily initFontFamily;
bool UIIsReady = false;

private void Init(object sender, EventArgs e)
{
    app = System.Windows.Application.Current;
    myWindow = (Window)app.MainWindow;
    myWindow.SizeToContent = SizeToContent.WidthAndHeight;
    wfh.TabIndex = 10;
    initFontSize = wfh.FontSize;
    initFontWeight = wfh.FontWeight;
    initFontFamily = wfh.FontFamily;
    initFontStyle = wfh.FontStyle;
    initBackBrush = (SolidColorBrush)wfh.Background;
    initForeBrush = (SolidColorBrush)wfh.Foreground;
    (wfh.Child as MyControl1).OnButtonClick += new MyControl1.MyControlEventHandler(Pane1_OnButtonClick);
    UIIsReady = true;
}
Private app As Application
Private myWindow As Window
Private initFontWeight As FontWeight
Private initFontSize As [Double]
Private initFontStyle As FontStyle
Private initBackBrush As SolidColorBrush
Private initForeBrush As SolidColorBrush
Private initFontFamily As FontFamily
Private UIIsReady As Boolean = False


Private Sub Init(ByVal sender As Object, ByVal e As RoutedEventArgs)
    app = System.Windows.Application.Current
    myWindow = CType(app.MainWindow, Window)
    myWindow.SizeToContent = SizeToContent.WidthAndHeight
    wfh.TabIndex = 10
    initFontSize = wfh.FontSize
    initFontWeight = wfh.FontWeight
    initFontFamily = wfh.FontFamily
    initFontStyle = wfh.FontStyle
    initBackBrush = CType(wfh.Background, SolidColorBrush)
    initForeBrush = CType(wfh.Foreground, SolidColorBrush)

    Dim mc As MyControl1 = wfh.Child

    AddHandler mc.OnButtonClick, AddressOf Pane1_OnButtonClick
    UIIsReady = True

End Sub

Karena XAML yang dibahas sebelumnya menambahkan MyControl1 ke dalam koleksi elemen turunan dari elemen WindowsFormsHost, Anda dapat mengubah tipe elemen WindowsFormsHost dari Child untuk memperoleh referensi ke MyControl1. Anda kemudian dapat menggunakan referensi tersebut untuk melampirkan penanganan aktivitas ke OnButtonClick.

Selain memberikan referensi ke kontrol itu sendiri, WindowsFormsHost mengekspos sejumlah properti kontrol, yang dapat Anda manipulasi dari aplikasi. Kode inisialisasi menetapkan nilai tersebut ke variabel global privat untuk digunakan nanti dalam aplikasi.

Sehingga Anda dapat dengan mudah mengakses jenis di DLL MyControls, tambahkan pernyataan Imports atau using berikut ke bagian atas file.

Imports MyControls
using MyControls;

Menangani Kejadian OnButtonClick

MyControl1 menaikkan peristiwa OnButtonClick saat pengguna mengklik salah satu tombol kontrol.

Tambahkan kode berikut ke kelas MainWindow.

//Handle button clicks on the Windows Form control
private void Pane1_OnButtonClick(object sender, MyControlEventArgs args)
{
    txtName.Inlines.Clear();
    txtAddress.Inlines.Clear();
    txtCity.Inlines.Clear();
    txtState.Inlines.Clear();
    txtZip.Inlines.Clear();

    if (args.IsOK)
    {
        txtName.Inlines.Add( " " + args.MyName );
        txtAddress.Inlines.Add( " " + args.MyStreetAddress );
        txtCity.Inlines.Add( " " + args.MyCity );
        txtState.Inlines.Add( " " + args.MyState );
        txtZip.Inlines.Add( " " + args.MyZip );
    }
}
'Handle button clicks on the Windows Form control
Private Sub Pane1_OnButtonClick(ByVal sender As Object, ByVal args As MyControlEventArgs)
    txtName.Inlines.Clear()
    txtAddress.Inlines.Clear()
    txtCity.Inlines.Clear()
    txtState.Inlines.Clear()
    txtZip.Inlines.Clear()

    If args.IsOK Then
        txtName.Inlines.Add(" " + args.MyName)
        txtAddress.Inlines.Add(" " + args.MyStreetAddress)
        txtCity.Inlines.Add(" " + args.MyCity)
        txtState.Inlines.Add(" " + args.MyState)
        txtZip.Inlines.Add(" " + args.MyZip)
    End If

End Sub

Data dalam kotak teks dikemas ke dalam objek MyControlEventArgs. Jika pengguna mengklik tombol OK, penanganan aktivitas mengekstrak data dan menampilkannya di panel di bawah ini MyControl1.

Mengubah Properti dari Kontrol

Elemen WindowsFormsHost mengekspos beberapa properti default kontrol yang dihosting. Akibatnya, Anda dapat mengubah tampilan kontrol agar sesuai dengan gaya aplikasi Anda dengan lebih dekat. Set tombol opsi di panel kiri memungkinkan pengguna untuk memodifikasi beberapa properti warna dan font. Setiap kumpulan tombol memiliki handler untuk peristiwa Click, yang mendeteksi pilihan tombol yang dipilih pengguna dan mengubah properti yang sesuai pada kendali.

Tambahkan kode berikut ke kelas MainWindow.

private void BackColorChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnBackGreen)
        wfh.Background = new SolidColorBrush(Colors.LightGreen);
    else if (sender == rdbtnBackSalmon)
        wfh.Background = new SolidColorBrush(Colors.LightSalmon);
    else if (UIIsReady == true)
        wfh.Background = initBackBrush;
}

private void ForeColorChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnForeRed)
        wfh.Foreground = new SolidColorBrush(Colors.Red);
    else if (sender == rdbtnForeYellow)
        wfh.Foreground = new SolidColorBrush(Colors.Yellow);
    else if (UIIsReady == true)
        wfh.Foreground = initForeBrush;
}

private void FontChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnTimes)
        wfh.FontFamily = new FontFamily("Times New Roman");
    else if (sender == rdbtnWingdings)
        wfh.FontFamily = new FontFamily("Wingdings");
    else if (UIIsReady == true)
        wfh.FontFamily = initFontFamily;
}
private void FontSizeChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnTen)
        wfh.FontSize = 10;
    else if (sender == rdbtnTwelve)
        wfh.FontSize = 12;
    else if (UIIsReady == true)
        wfh.FontSize = initFontSize;
}
private void StyleChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnItalic)
        wfh.FontStyle = FontStyles.Italic;
    else if (UIIsReady == true)
        wfh.FontStyle = initFontStyle;
}
private void WeightChanged(object sender, RoutedEventArgs e)
{
    if (sender == rdbtnBold)
        wfh.FontWeight = FontWeights.Bold;
    else if (UIIsReady == true)
        wfh.FontWeight = initFontWeight;
}
Private Sub BackColorChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)

    If sender.Equals(rdbtnBackGreen) Then
        wfh.Background = New SolidColorBrush(Colors.LightGreen)
    ElseIf sender.Equals(rdbtnBackSalmon) Then
        wfh.Background = New SolidColorBrush(Colors.LightSalmon)
    ElseIf UIIsReady = True Then
        wfh.Background = initBackBrush
    End If

End Sub

Private Sub ForeColorChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnForeRed) Then
        wfh.Foreground = New SolidColorBrush(Colors.Red)
    ElseIf sender.Equals(rdbtnForeYellow) Then
        wfh.Foreground = New SolidColorBrush(Colors.Yellow)
    ElseIf UIIsReady = True Then
        wfh.Foreground = initForeBrush
    End If

End Sub

Private Sub FontChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnTimes) Then
        wfh.FontFamily = New FontFamily("Times New Roman")
    ElseIf sender.Equals(rdbtnWingdings) Then
        wfh.FontFamily = New FontFamily("Wingdings")
    ElseIf UIIsReady = True Then
        wfh.FontFamily = initFontFamily
    End If

End Sub

Private Sub FontSizeChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnTen) Then
        wfh.FontSize = 10
    ElseIf sender.Equals(rdbtnTwelve) Then
        wfh.FontSize = 12
    ElseIf UIIsReady = True Then
        wfh.FontSize = initFontSize
    End If

End Sub

Private Sub StyleChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnItalic) Then
        wfh.FontStyle = FontStyles.Italic
    ElseIf UIIsReady = True Then
        wfh.FontStyle = initFontStyle
    End If

End Sub

Private Sub WeightChanged(ByVal sender As Object, ByVal e As RoutedEventArgs)
    If sender.Equals(rdbtnBold) Then
        wfh.FontWeight = FontWeights.Bold
    ElseIf UIIsReady = True Then
        wfh.FontWeight = initFontWeight
    End If

End Sub

Bangun dan jalankan aplikasi. Tambahkan beberapa teks dalam kontrol komposit Formulir Windows lalu klik OK. Teks muncul di label. Klik tombol radio yang berbeda untuk melihat efek pada kontrol.

Lihat juga