Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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ı gerçekleştirme.
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 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 çizilmiş 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,
WindowsFormsHostingWpfControl
gibi uygun adlandırılmış bir üst düzey klasör belirtin. Daha sonra konak uygulamasını bu klasöre yerleştireceksiniz.Projeyi oluşturmak için Tamam'e tıklayın. Varsayılan proje
UserControl1
adlı tek bir denetim içerir.Çözüm Gezgini'nde
UserControl1
MyControl1
olarak yeniden adlandırın.
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 Button ve İptal olarak iki öğ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.
Grid'ı, bileşik denetimin içeriğini HTML'deki Table
öğesi gibi düzenlemek için kullanabilirsiniz. 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>
Izgaraya TextBlock ve TextBox Öğeleri Ekleme
UI öğesini kılavuza yerleştirmek için öğenin RowProperty ve ColumnProperty özniteliklerini uygun satır ve sütun numarasına ayarlarsınız. 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 dosyasında, Grid öğesi içinde aşağıdaki XAML'yi 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 öğeleri, Grid öğesinin Resources özelliğinde yer alır, böylece denetimdeki tüm öğeler tarafından kullanılabilir. Bir stil adlandırılmışsa, stilin adına ayarlanmış bir Style öğesi ekleyerek bunu bir elemana 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>
Code-Behind Dosyasını Uygulama
Arka planda kod dosyası MyControl1.xaml.cs üç temel görev uygular:
Kullanıcı düğmelerden birine tıkladığında gerçekleşen olayı işler.
TextBox öğelerinden verileri alır ve bunları özel bir olay bağımsız değişkeni nesnesinde paketler.
Kullanıcının tamamlandığını konağa bildiren ve verileri konağa ileten özel
OnButtonClick
olayını tetikler.
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.
Code-Behind Dosyasının Temel Yapısı
Kod dosyası, iki sınıf olan MyControls
ve MyControl1
içerecek şekilde, tek bir ad alanı, MyControlEventArgs
, 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'i açın. Mevcut sınıf bildirimini, belirtilen adı taşıyacak ve Grid öğesinden devralacak ş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
Init
olayı için bir işleyici Loaded( ) uygular. Bu işleyici, genel değişkenleri MyControl1.xaml içinde tanımlanan değerleri atayarak başlatır. Bunu yapmak için, tipik bir Name öğesine atanan TextBlock kullanarak, bu öğenin özellik ayarlarına erişirnameLabel
.
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
veya btnCancel
adında, işleyicinin sender
bağımsız değişkeninin değerini inceleyerek hangi düğmeye tıklandığını belirlemesini sağlayan bir adı vardır. İşleyici aşağıdakileri yapar:
Öğelerden
MyControlEventArgs
verileri içeren bir TextBox nesne oluşturur.Kullanıcı İptal düğmesine tıkladıysa, nesnenin
MyControlEventArgs
IsOK
özelliğini olarakfalse
ayarlar.Sunucuya kullanıcının işlemini tamamladığını göstermek ve toplanan verileri geri iletmek için
OnButtonClick
olayını tetikler.
MyControl1
yönteminden sonra aşağıdaki kodu Init
sınıfınıza 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.dlladlı bir DLL oluşturur.
Windows Forms Sunucu Uygulamasını Gerçekleştirme
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 OnButtonClick
olayını ele alır. 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'e tıklayın.
Ayrıca, MyControl1
ve diğer derlemeleri içeren DLL'ye referanslar eklemeniz gerekir.
Çözüm Gezgini'nde proje adına sağ tıklayın ve Başvuru Ekle'yi seçin.
Gözat sekmesine tıklayın ve MyControls.dlliçeren klasöre gidin. Bu izlenecek yol için bu klasör MyControls\bin\Debug klasörüdür.
MyControls.dll'i seçin ve ardından Tamam'ne tıklayın.
Aşağıdaki derlemelere referanslar ekleyin.
PresentationCore
PresentationFramework
System.Xaml
WindowsBase
WindowsFormsIntegration
Uygulamanın 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ımcısı'nda 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.
İsim 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 Aşağıdaki System.Windows.Forms.RadioButton denetimlerini System.Windows.Forms.GroupBox denetimlerine ekleyin.
GroupBox İsim Metin groupBox1 radioArkaPlanOrijinal Özgün groupBox1 radyoArkaPlanAçıkYeşil Açık Yeşil groupBox1 radioBackgroundLightSalmon LightSalmon groupBox2 radyonunÖnPlanOrijinali Özgün groupBox2 radyoÖnPlanKırmızı Kırmızı groupBox2 radioÖnPlanSarı Sarı groupBox3 radyoBoyutuOrijinal Özgün groupBox3 radioSizeTen 10 groupBox3 radioSizeTwelve 12 Grup Kutusu4 radioFamilyOriginal Özgün groupBox4 radioFamilyTimes Times New Roman groupBox4 radioFamilyWingDings Wingdings groupBox5 radioStyleOriginal Sıradan groupBox5 radyoStilİtalik İtalik 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 İsim Metin groupBox7 lblName Ad: groupBox7 lblAdres Sokak Adresi: groupBox7 lblCity Şehir: groupBox7 lblState Devlet: groupBox7 lblZip Posta Kodu
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ımcısı'nda, forma çift tıklayarak bir Load olay işleyicisi oluşturun. Form1.cs 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;
}
Önceki koddaki Form1_Load
yöntemi, bir WPF denetimini barındırmak için genel bir prosedürü gösterir.
Yeni ElementHost bir nesne oluşturun.
Denetimin Dock özelliğini DockStyle.Fillolarak ayarlayın.
ElementHost denetimini Panel denetiminin Controls koleksiyonuna ekleyin.
WPF denetiminin bir örneğini oluşturun.
Bileşik denetimi, denetimi ElementHost denetiminin Child özelliğine atayarak formda barındırın.
Form1_Load
metodundaki 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. Örnek, kontrolün özelliklerinden yararlanarak birkaç genel değişkeni başlatması gerektiği için burada etkinlik 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üğme tıklama olay işleyici kodunu Form1
sınıfına ekleyin.
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. ElementHost nesnesi arka plan rengini gösterir. Kalan özellikler denetimin özel özellikleri olarak sunulur.
Formdaki her RadioButton denetime çift tıklayarak CheckedChanged olay işleyicilerini oluşturun. 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 bakınız
.NET Desktop feedback