İ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:
Projeyi Oluşturma
Projeyi başlatmak için:
Visual Studio'yu başlatın ve Yeni Proje iletişim kutusunu açın.
Visual C# ve Windows kategorisinde WPF Kullanıcı Denetimi Kitaplığı şablonunu seçin.
Yeni projeyi
MyControls
olarak adlandırın.Konum için, gibi
WindowsFormsHostingWpfControl
uygun bir şekilde adlandırılmış en üst düzey klasör belirtin. Daha sonra konak uygulamasını bu klasöre yerleştireceksiniz.Projeyi oluşturmak için Tamam'a tıklayın. Varsayılan proje adlı
UserControl1
tek bir denetim içerir.Çözüm Gezgini'da olarak yeniden adlandırın
UserControl1
MyControl1
.
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, ButtonClicked
ve ö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:
Kullanıcı düğmelerden birine tıkladığında gerçekleşen olayı işler.
Öğelerden TextBox verileri alır ve özel bir olay bağımsız değişkeni nesnesinde paketler.
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ı, MyControls
ve olmak üzere iki sınıf MyControl1
MyControlEventArgs
içeren tek bir ad alanı içerir.
namespace MyControls
{
public partial class MyControl1 : Grid
{
//...
}
public class MyControlEventArgs : EventArgs
{
//...
}
}
birinci sınıf, MyControl1
MyControl1.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
OnButtonClick
ilişkili temsilcisini bildirirMyControlEventHandler
.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 öğesinenameLabel
atanan öğ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 btnCancel
vardı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
MyControlEventArgs
IsOK
özelliğini olarakfalse
ayarlar.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
Projeyi Oluşturma
Projeyi başlatmak için:
Visual Studio'yu başlatın ve Yeni Proje iletişim kutusunu açın.
Visual C# ve Windows kategorisinde Windows Forms Uygulaması şablonunu seçin.
Yeni projeyi
WFHost
olarak adlandırın.Konum için MyControls projesini içeren en üst düzey klasörü belirtin.
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.
Çözüm Gezgini proje adına sağ tıklayın ve Başvuru Ekle'yi seçin.
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.
MyControls.dll dosyasını seçip Tamam'a tıklayın.
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.
Form1'i Windows Form Tasarım Aracı açın.
Formu denetimleri barındıracak şekilde büyütün.
Formun sağ üst köşesinde WPF bileşik denetimini tutmak için bir System.Windows.Forms.Panel denetim ekleyin.
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 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 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:
Yeni ElementHost bir nesne oluşturun.
Denetimin Dock özelliğini olarak DockStyle.Fillayarlayın.
Denetimi denetimin ElementHost koleksiyonuna PanelControls ekleyin.
WPF denetiminin bir örneğini oluşturun.
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
null
ayarlanı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.
.NET Desktop feedback