İzlenecek yol: WPF İçeriğini Win32 içinde Barındırma
Windows Presentation Foundation (WPF) uygulamalar oluşturmak için zengin bir ortam sağlar. Ancak, Win32 kodunda önemli bir yatırımınız varsa, WPF özgün kodunuzu yeniden yazmak yerine uygulamanıza işlevsellik eklemek daha etkili olabilir. WPF bir Win32 penceresinde içerik barındırmak için basit bir mekanizma sağlar WPF .
Bu öğreticide, bir Win32 penceresinde içerik barındıran bir Win32 pencere ÖRNEĞINDE WPF Içeriği barındıranörnek bir uygulamanın nasıl yazılacağı açıklanmaktadır WPF . Bu örneği, herhangi bir Win32 penceresini barındırmak için genişletebilirsiniz. Yönetilen ve yönetilmeyen kodu karıştırmayı içerdiğinden, uygulama C++/clidilinde yazılır.
Gereksinimler
Bu öğreticide, hem hem de Win32 programlamasında temel bir benzerlik olduğu varsayılır WPF . Programlamaya temel bir giriş için WPF bkz. Başlarken . Win32 programlamaya giriş için, özellikle Charles Petzold tarafından yapılan belirli bir programlama penceresinde, konudaki çok sayıda kitaplardan birine başvurmanız gerekir.
Bu öğreticiye eşlik eden örnek C++/CLı ' da uygulandığından, bu öğreticide, Windows API 'sini programlamak ve yönetilen kod programlamayı anlamak için C++ kullanımıyla ilgili bilgiler yer aldığını varsayar. C++/CLı ile benzerlik, yararlı ancak gerekli değildir.
Not
Bu öğretici, ilişkili örnekten bir dizi kod örneği içerir. Ancak okunabilirlik için, örnek kodu tamamen içermez. Tüm örnek kod için bkz. bir Win32 pencere ÖRNEĞINDE WPF Içeriğini barındırma.
Temel yordam
Bu bölümde, WPF içeriği bir Win32 penceresinde barındırmak için kullandığınız temel yordam özetlenmektedir. Kalan bölümlerde her adımın ayrıntıları açıklanmaktadır.
WPFBir Win32 penceresinde içeriği barındırmak için anahtar HwndSource sınıfındır. Bu sınıf, içeriği bir Win32 penceresinde sarmalanmış ve bu da WPF kullanıcı arabirimi (UI) bir alt pencere olarak kendi uygulamanıza dahil olmasını sağlar. Aşağıdaki yaklaşım, Win32 öğesini ve WPF tek bir uygulamada birleştirir.
WPFİçeriğinizi yönetilen bir sınıf olarak uygulayın.
C++/CLIILE bir Windows uygulaması uygulayın. Var olan bir uygulama ve yönetilmeyen C++ kodu ile başlıyorsanız, genellikle proje ayarlarınızı derleyici bayrağını içerecek şekilde değiştirerek yönetilen kodu çağırmak için bunu etkinleştirebilirsiniz
/clr.İş parçacığı modelini tek iş parçacıklı Apartment (STA) olarak ayarlayın.
WM_CREATEbildirimini pencere yordamınıza işleyin ve şunları yapın:
HwndSourceÜst pencereyle parametresi olarak yeni bir nesne oluşturun
parent.İçerik sınıfınızın bir örneğini oluşturun WPF .
WPFÖzelliğine içerik nesnesine bir başvuru atayın RootVisual HwndSource .
İçerik için HWND 'yi alın. HandleNesnesinin özelliği, HwndSource pencere TANıTıCıSıNı (hwnd) içerir. Uygulamanızın yönetilmeyen bölümünde kullanabileceğiniz bir HWND almak için
Handle.ToPointer()BIR HWND 'ye atayın.
İçeriğiniz için bir başvuru tutmak üzere statik alan içeren bir yönetilen sınıf uygulayın WPF . Bu sınıf, Win32 kodunuzun içeriğine yönelik bir başvuru almanızı sağlar WPF .
WPFİçeriği statik alana atayın.
Bir WPF veya daha fazla olaya bir işleyici ekleyerek içerikten bildirim alın WPF .
WPFÖzellikleri ayarlamak için statik alanda depoladığınız başvuruyu kullanarak içerikle iletişim kurun ve bu şekilde devam edin.
Not
Extensible Application Markup Language (XAML)İçeriğinizi uygulamak için de kullanabilirsiniz WPF . Bununla birlikte, bir dinamik bağlantı kitaplığı (DLL) olarak ayrı olarak derlemek ve Win32 uygulamanızdan bu DLL 'ye başvurmanız gerekir. Yordamın geri kalanı yukarıda ana hatlarıyla benzerdir.
Konak uygulamasını uygulama
Bu bölümde WPF , basit bir Win32 uygulamasında içerik barındırma açıklanmaktadır. İçerik, C++/CLı ' da yönetilen bir sınıf olarak uygulanır. Çoğu bölümde, basit bir WPF programlama olur. İçerik uygulamasının temel yönleri WPF Içeriğini uygulamabölümünde ele alınmıştır.
Temel uygulama
Ana bilgisayar uygulaması için başlangıç noktası, bir Visual Studio 2005 şablonu oluşturmaktır.
Visual Studio 2005 ' i açın ve Dosya menüsünden Yeni proje ' yi seçin.
Visual C++ proje türleri listesinden Win32 öğesini seçin. Varsayılan diliniz C++ değilse, bu proje türlerini diğer diller altında bulacaksınız.
Bir Win32 Proje şablonu seçin, projeye bir ad atayın ve Win32 uygulama sihirbazını başlatmak için Tamam ' a tıklayın.
Sihirbazın varsayılan ayarlarını kabul edin ve projeyi başlatmak için son ' a tıklayın.
Şablon, aşağıdakiler dahil olmak üzere temel bir Win32 uygulaması oluşturur:
Uygulama için bir giriş noktası.
İlişkili bir pencere yordamıyla (WndProc) bir pencere.
Dosya ve Yardım başlıkları içeren bir menü. Dosya menüsünde, uygulamayı kapatan bir Çıkış öğesi vardır. Yardım menüsünde basit bir iletişim kutusu başlatan hakkında bir öğe bulunur.
İçeriği barındırmak için kod yazmaya başlamadan önce WPF , temel şablonda iki değişiklik yapmanız gerekir.
Birincisi, projeyi yönetilen kod olarak derlemek olur. Varsayılan olarak, proje yönetilmeyen kod olarak derlenir. Ancak, WPF yönetilen kodda uygulandığından, projenin buna göre derlenmesi gerekir.
Çözüm Gezgini ' de proje adına sağ tıklayın ve bağlam menüsünden Özellikler ' i seçerek Özellik sayfaları iletişim kutusunu başlatın.
Sol bölmedeki ağaç görünümünden yapılandırma özellikleri ' ni seçin.
Sağ bölmedeki Proje Varsayılanları listesinden ortak dil çalışma zamanı desteği ' ni seçin.
Açılan liste kutusundan ortak dil çalışma zamanı desteği (/CLR) öğesini seçin.
Not
Bu derleyici bayrağı uygulamanızda yönetilen kod kullanmanıza izin verir, ancak yönetilmeyen kodunuz daha önce olduğu gibi derlenmeye devam eder.
WPF tek iş parçacıklı Apartment (STA) iş parçacığı modelini kullanır. İçerik kodu ile düzgün bir şekilde çalışabilmek için WPF , giriş noktasına bir öznitelik uygulayarak uygulamanın iş parçacığı MODELINI STA olarak ayarlamanız gerekir.
[System::STAThreadAttribute] //Needs to be an STA thread to play nicely with WPF
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
WPF Içeriğini barındırma
WPFİçerik, basit bir adres girişi uygulamasıdır. TextBoxKullanıcı adı, adres vb. almak için çeşitli denetimlerden oluşur. Ayrıca Button , Tamam ve iptal' de iki denetim vardır. Kullanıcı Tamam' ı tıklattığında, düğmenin Click olay işleyicisi denetimlerden verileri toplar TextBox , bunları karşılık gelen özelliklere atar ve özel bir olay oluşturur OnButtonClicked . Kullanıcı iptal' i tıklattığında işleyici yalnızca yükseltilir OnButtonClicked . İçin olay bağımsız değişkeni nesnesi, OnButtonClicked hangi düğmenin tıklandığını gösteren bir Boole alanı içerir.
İçeriği barındıracak kod, WPF ana bilgisayar penceresinde WM_CREATE bildirimi için bir işleyicide uygulanır.
case WM_CREATE :
GetClientRect(hWnd, &rect);
wpfHwnd = GetHwnd(hWnd, rect.right-375, 0, 375, 250);
CreateDataDisplay(hWnd, 275, rect.right-375, 375);
CreateRadioButtons(hWnd);
break;
GetHwndYöntemi, boyut ve konum bilgilerini ve üst pencere tanıtıcısını alır ve barındırılan içeriğin pencere tanıtıcısını döndürür WPF .
Not
#usingAd alanı için bir yönerge kullanamazsınız System::Windows::Interop . Bunun yapılması, MSG Bu ad alanındaki yapı ve Winuser. h içinde BELIRTILEN MSG yapısı arasında bir ad çakışması oluşturur. Bunun yerine, bu ad alanının içeriğine erişmek için tam nitelikli adlar kullanmanız gerekir.
HWND GetHwnd(HWND parent, int x, int y, int width, int height)
{
System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew System::Windows::Interop::HwndSourceParameters(
"hi" // NAME
);
sourceParams->PositionX = x;
sourceParams->PositionY = y;
sourceParams->Height = height;
sourceParams->Width = width;
sourceParams->ParentWindow = IntPtr(parent);
sourceParams->WindowStyle = WS_VISIBLE | WS_CHILD; // style
System::Windows::Interop::HwndSource^ source = gcnew System::Windows::Interop::HwndSource(*sourceParams);
WPFPage ^myPage = gcnew WPFPage(width, height);
//Assign a reference to the WPF page and a set of UI properties to a set of static properties in a class
//that is designed for that purpose.
WPFPageHost::hostedPage = myPage;
WPFPageHost::initBackBrush = myPage->Background;
WPFPageHost::initFontFamily = myPage->DefaultFontFamily;
WPFPageHost::initFontSize = myPage->DefaultFontSize;
WPFPageHost::initFontStyle = myPage->DefaultFontStyle;
WPFPageHost::initFontWeight = myPage->DefaultFontWeight;
WPFPageHost::initForeBrush = myPage->DefaultForeBrush;
myPage->OnButtonClicked += gcnew WPFPage::ButtonClickHandler(WPFButtonClicked);
source->RootVisual = myPage;
return (HWND) source->Handle.ToPointer();
}
WPFİçeriği doğrudan uygulama pencerenizde barındıryükleyemezsiniz. Bunun yerine, önce HwndSource içeriği kaydırmak için bir nesne oluşturun WPF . Bu nesne temelde bir içeriği barındırmak için tasarlanan bir penceredir WPF . HwndSourceUygulamayı, uygulamanızın bir parçası olan Win32 penceresinin alt öğesi olarak oluşturarak ana pencerede barındırabilirsiniz. HwndSourceOluşturucu parametreleri, bir Win32 alt penceresi oluştururken CreateWindow 'a geçirdiğiniz bilgilerin çoğunu içerir.
Bir sonraki adımda içerik nesnesinin bir örneğini oluşturun WPF . Bu durumda, WPF Içerik WPFPage C++/clikullanarak ayrı bir sınıf olarak uygulanır. Ayrıca içeriğini de uygulayabilirsiniz WPF XAML . Ancak bunu yapmak için ayrı bir proje ayarlamanız ve WPF içeriği BIR DLL olarak oluşturmanız gerekir. Projenize bu DLL 'ye bir başvuru ekleyebilir ve bu başvuruyu içerik örneği oluşturmak için kullanabilirsiniz WPF .
İçeriğine WPF bir başvuru atayarak, içeriği alt pencerenizde görüntüleyin WPF RootVisual HwndSource .
Sonraki kod satırı, içerik olayına bir olay işleyicisi ekler WPFButtonClicked WPF OnButtonClicked . Bu işleyici Kullanıcı Tamam veya iptal düğmesine tıkladığında çağrılır. Bu olay işleyicisi hakkında daha fazla tartışma için bkz. communicating_with_the_WPF içeriği .
Gösterilen kodun son satırı, nesnesiyle ilişkili pencere tanıtıcısını (HWND) döndürür HwndSource . Bu tanıtıcıyı, barındırılan pencereye ileti göndermek için Win32 kodunuzda kullanabilirsiniz, ancak örnek bunu yapmaz. HwndSourceNesnesi bir iletiyi her aldığında bir olay oluşturur. İletileri işlemek için, AddHook bir ileti işleyicisi iliştirmek ve sonra bu işleyicide iletileri işlemek üzere yöntemini çağırın.
WPF Içeriğine başvuru tutma
Birçok uygulama için, WPF içerikle daha sonra iletişim kurmak isteyeceksiniz. Örneğin, WPF içerik özelliklerini değiştirmek veya belki de HwndSource nesne farklı içerik barındırmak isteyebilirsiniz WPF . Bunu yapmak için, nesne veya içeriğe bir başvuru gerekir HwndSource WPF . HwndSourceNesne ve ilişkili WPF içeriği, pencere tanıtıcısını yok edinceye kadar bellekte kalır. Ancak, nesnesine atadığınız değişken, HwndSource pencere yordamından döndükten hemen sonra kapsam dışına çıkar. Win32 uygulamalarında bu sorunu işlemenin normal yöntemi, statik veya genel bir değişken kullanmaktır. Ne yazık ki, bu tür değişkenlere yönetilen bir nesne atayamazsınız. Nesneyle ilişkili pencere tanıtıcısını HwndSource genel veya statik bir değişkene atayabilir, ancak bu, söz konusu tikan nesnenin kendisi için erişim sağlamaz.
Bu soruna en basit çözüm, erişmeniz gereken herhangi bir yönetilen nesne için başvuruları tutmak üzere statik alanlar kümesi içeren bir yönetilen sınıf uygulamaktır. Örnek, WPFPageHost içerik başvurusunu tutmak için sınıfını ve WPF daha sonra Kullanıcı tarafından değiştirilebilecek bir dizi özelliğin başlangıç değerlerini kullanır. Bu, üst bilgide tanımlanmıştır.
public ref class WPFPageHost
{
public:
WPFPageHost();
static WPFPage^ hostedPage;
//initial property settings
static System::Windows::Media::Brush^ initBackBrush;
static System::Windows::Media::Brush^ initForeBrush;
static System::Windows::Media::FontFamily^ initFontFamily;
static System::Windows::FontStyle initFontStyle;
static System::Windows::FontWeight initFontWeight;
static double initFontSize;
};
İşlevin ikinci bölümü, GetHwnd daha sonra kullanılmak üzere bu alanlara değerler atar myPage , ancak hala kapsamdadır.
WPF Içeriğiyle iletişim kurma
İçerikle iki tür iletişim vardır WPF . WPFKullanıcı Tamam veya iptal düğmelerine tıkladığında uygulama içerikten bilgi alır. Uygulamanın Kullanıcı arabirimi WPF arka plan rengi veya varsayılan yazı tipi boyutu gibi çeşitli içerik özelliklerini değiştirmesine izin veren bir de vardır.
Yukarıda belirtildiği gibi, Kullanıcı herhangi bir düğmeye tıkladığında WPF içerik bir OnButtonClicked olay oluşturur. Uygulama bu bildirimleri almak için bu olaya bir işleyici ekler. Tamam düğmesine tıklandığı işleyici, içerikten Kullanıcı bilgilerini alır WPF ve Statik denetimler kümesi içinde görüntüler.
void WPFButtonClicked(Object ^sender, MyPageEventArgs ^args)
{
if(args->IsOK) //display data if OK button was clicked
{
WPFPage ^myPage = WPFPageHost::hostedPage;
LPCWSTR userName = (LPCWSTR) InteropServices::Marshal::StringToHGlobalAuto("Name: " + myPage->EnteredName).ToPointer();
SetWindowText(nameLabel, userName);
LPCWSTR userAddress = (LPCWSTR) InteropServices::Marshal::StringToHGlobalAuto("Address: " + myPage->EnteredAddress).ToPointer();
SetWindowText(addressLabel, userAddress);
LPCWSTR userCity = (LPCWSTR) InteropServices::Marshal::StringToHGlobalAuto("City: " + myPage->EnteredCity).ToPointer();
SetWindowText(cityLabel, userCity);
LPCWSTR userState = (LPCWSTR) InteropServices::Marshal::StringToHGlobalAuto("State: " + myPage->EnteredState).ToPointer();
SetWindowText(stateLabel, userState);
LPCWSTR userZip = (LPCWSTR) InteropServices::Marshal::StringToHGlobalAuto("Zip: " + myPage->EnteredZip).ToPointer();
SetWindowText(zipLabel, userZip);
}
else
{
SetWindowText(nameLabel, L"Name: ");
SetWindowText(addressLabel, L"Address: ");
SetWindowText(cityLabel, L"City: ");
SetWindowText(stateLabel, L"State: ");
SetWindowText(zipLabel, L"Zip: ");
}
}
İşleyici, içerikten özel bir olay bağımsız değişkeni nesnesi alır WPF MyPageEventArgs . Nesnenin IsOK özelliği true Tamam düğmesine Tıklandıysa ve false iptal düğmesi tıklandıysa olarak ayarlanır.
Tamam düğmesine tıklandığı işleyici WPF kapsayıcı sınıfından içeriğe bir başvuru alır. Daha sonra, ilişkili içerik özellikleri tarafından tutulan Kullanıcı bilgilerini toplar WPF ve ana pencerede bilgileri göstermek için statik denetimleri kullanır. WPFİçerik verileri yönetilen bir dize biçiminde olduğundan, bir Win32 denetimi tarafından kullanılmak üzere sıralanmalıdır. İptal düğmesine tıklandığında, işleyici verileri statik denetimlerden temizler.
Uygulama, Kullanıcı arabirimi kullanıcının içeriğin arka plan rengini WPF ve yazı tipiyle ilgili birkaç özelliği değiştirmesine izin veren radyo düğmeleri kümesi sağlar. Aşağıdaki örnek, uygulamanın pencere yordamından (WndProc) ve arka plan rengi dahil farklı iletilerde çeşitli özellikleri ayarlayan ileti işlemenin bir alıntısıdır. Diğerleri benzerdir ve gösterilmemiştir. Ayrıntılar ve bağlam için tüm örneğe bakın.
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
//Menu selections
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
//RadioButtons
case IDC_ORIGINALBACKGROUND :
WPFPageHost::hostedPage->Background = WPFPageHost::initBackBrush;
break;
case IDC_LIGHTGREENBACKGROUND :
WPFPageHost::hostedPage->Background = gcnew SolidColorBrush(Colors::LightGreen);
break;
case IDC_LIGHTSALMONBACKGROUND :
WPFPageHost::hostedPage->Background = gcnew SolidColorBrush(Colors::LightSalmon);
break;
Arka plan rengini ayarlamak için, WPF () içeriğine bir başvuru alın hostedPage WPFPageHost ve arka plan rengi özelliğini uygun renge ayarlayın. Örnek üç renk seçeneği kullanır: orijinal renk, açık yeşil veya hafif Salmon. Özgün arka plan rengi, sınıfında statik bir alan olarak depolanır WPFPageHost . Diğerini ayarlamak için yeni bir SolidColorBrush nesne oluşturur ve oluşturucuyu nesnesinden statik renkler değeri geçirin Colors .
WPF sayfasını uygulama
WPFİçeriği gerçek uygulamayla ilgili herhangi bir bilgi olmadan barındırabilirsiniz ve kullanabilirsiniz. WPFİçerik ayrı BIR DLL 'de paketlenmişse, herhangi bir ortak dil çalışma zamanı (CLR) dilinde oluşturulmuş olabilir. Aşağıda, örnekte kullanılan C++/CLı uygulamasının kısa bir yolu verilmiştir. Bu bölüm aşağıdaki alt bölümleri içerir.
Layout
Kullanıcı arabirimi WPF İçerikteki öğeler TextBox , ilişkili denetimlerle birlikte beş denetimden oluşur Label : ad, adres, şehir, eyalet ve zip. Ayrıca Button , Tamam ve iptal et olmak üzere iki denetim vardır
WPFİçerik, WPFPage sınıfında uygulanır. Düzen bir Grid Düzen öğesiyle işlenir. Sınıfı öğesinden devralır Grid , bu, içerik kök öğesi etkin bir şekilde oluşturur WPF .
WPFİçerik Oluşturucu gerekli genişliği ve yüksekliği alır ve Grid uygun şekilde boyutları. Daha sonra temel düzeni tanımlar ColumnDefinition ve nesneler kümesi oluşturup RowDefinition nesneleri Grid sırasıyla nesne tabanına ColumnDefinitions ve RowDefinitions koleksiyonlara ekler. Bu, hücrelerin içeriğine göre belirlenen boyutları içeren beş satırlık ve yedi sütundan oluşan bir kılavuz tanımlar.
WPFPage::WPFPage(int allottedWidth, int allotedHeight)
{
array<ColumnDefinition ^> ^ columnDef = gcnew array<ColumnDefinition ^> (4);
array<RowDefinition ^> ^ rowDef = gcnew array<RowDefinition ^> (6);
this->Height = allotedHeight;
this->Width = allottedWidth;
this->Background = gcnew SolidColorBrush(Colors::LightGray);
//Set up the Grid's row and column definitions
for(int i=0; i<4; i++)
{
columnDef[i] = gcnew ColumnDefinition();
columnDef[i]->Width = GridLength(1, GridUnitType::Auto);
this->ColumnDefinitions->Add(columnDef[i]);
}
for(int i=0; i<6; i++)
{
rowDef[i] = gcnew RowDefinition();
rowDef[i]->Height = GridLength(1, GridUnitType::Auto);
this->RowDefinitions->Add(rowDef[i]);
}
Sonra, Oluşturucu Kullanıcı arabirimi öğelerini öğesine ekler Grid . İlk öğe, Label kılavuzun ilk satırına ortalanmış bir denetim olan başlık metindir.
//Add the title
titleText = gcnew Label();
titleText->Content = "Simple WPF Control";
titleText->HorizontalAlignment = System::Windows::HorizontalAlignment::Center;
titleText->Margin = Thickness(10, 5, 10, 0);
titleText->FontWeight = FontWeights::Bold;
titleText->FontSize = 14;
Grid::SetColumn(titleText, 0);
Grid::SetRow(titleText, 0);
Grid::SetColumnSpan(titleText, 4);
this->Children->Add(titleText);
Sonraki satır, ad Label denetimini ve ilişkili TextBox denetimini içerir. Her etiket/metin kutusu çifti için aynı kod kullanıldığından, bir dizi özel yönteme yerleştirilir ve beş etiket/metin kutusu çifti için kullanılır. Yöntemler uygun denetimi oluşturur ve Grid SetColumn SetRow denetimleri uygun hücreye yerleştirmek için static ve Methods sınıfını çağırır. Denetim oluşturulduktan sonra örnek, Add Children Grid denetimi kılavuza eklemek için öğesinin özelliği üzerinde yöntemini çağırır. Kalan etiketi/TextBox çiftlerini eklemek için kod benzerdir. Ayrıntılar için örnek koda bakın.
//Add the Name Label and TextBox
nameLabel = CreateLabel(0, 1, "Name");
this->Children->Add(nameLabel);
nameTextBox = CreateTextBox(1, 1, 3);
this->Children->Add(nameTextBox);
İki yöntemin uygulanması aşağıdaki gibidir:
Label ^WPFPage::CreateLabel(int column, int row, String ^ text)
{
Label ^ newLabel = gcnew Label();
newLabel->Content = text;
newLabel->Margin = Thickness(10, 5, 10, 0);
newLabel->FontWeight = FontWeights::Normal;
newLabel->FontSize = 12;
Grid::SetColumn(newLabel, column);
Grid::SetRow(newLabel, row);
return newLabel;
}
TextBox ^WPFPage::CreateTextBox(int column, int row, int span)
{
TextBox ^newTextBox = gcnew TextBox();
newTextBox->Margin = Thickness(10, 5, 10, 0);
Grid::SetColumn(newTextBox, column);
Grid::SetRow(newTextBox, row);
Grid::SetColumnSpan(newTextBox, span);
return newTextBox;
}
Son olarak, örnek, Tamam ve iptal düğmelerini ekler ve olaylarına bir olay işleyicisi ekler Click .
//Add the Buttons and atttach event handlers
okButton = CreateButton(0, 5, "OK");
cancelButton = CreateButton(1, 5, "Cancel");
this->Children->Add(okButton);
this->Children->Add(cancelButton);
okButton->Click += gcnew RoutedEventHandler(this, &WPFPage::ButtonClicked);
cancelButton->Click += gcnew RoutedEventHandler(this, &WPFPage::ButtonClicked);
Veriler konak penceresine döndürülüyor
Düğmeye tıklandığında, Click olayı tetiklenir. Ana bilgisayar penceresi yalnızca bu olaylara işleyicileri iliştirebilir ve doğrudan denetimlerden verileri alabilir TextBox . Örnek biraz daha az bir doğrudan yaklaşım kullanır. Clickİçeriği içinde işler WPF ve sonra içeriğe bildirimde bulunan özel bir olay oluşturur OnButtonClicked WPF . Bu, WPF içeriğin konağa bildirmeden önce bazı parametre doğrulaması yapmasına olanak sağlar. İşleyici, denetimlerden metni alır TextBox ve ana bilgisayarın bilgileri alabileceği ortak özelliklere atar.
, WPFPage. h içindeki olay bildirimi:
public:
delegate void ButtonClickHandler(Object ^, MyPageEventArgs ^);
WPFPage();
WPFPage(int height, int width);
event ButtonClickHandler ^OnButtonClicked;
ClickWPFPage. cpp içindeki olay işleyicisi:
void WPFPage::ButtonClicked(Object ^sender, RoutedEventArgs ^args)
{
//TODO: validate input data
bool okClicked = true;
if(sender == cancelButton)
okClicked = false;
EnteredName = nameTextBox->Text;
EnteredAddress = addressTextBox->Text;
EnteredCity = cityTextBox->Text;
EnteredState = stateTextBox->Text;
EnteredZip = zipTextBox->Text;
OnButtonClicked(this, gcnew MyPageEventArgs(okClicked));
}
WPF özelliklerini ayarlama
Win32 ana bilgisayarı, kullanıcının çeşitli içerik özelliklerini değiştirmesine izin verir WPF . Win32 tarafında, özelliklerin değiştirilmesinin bir önemi vardır. WPFTüm denetimlerin yazı tiplerini denetleyen tek bir genel özellik olmadığından, içerik sınıfındaki uygulama biraz daha karmaşıktır. Bunun yerine, her denetim için uygun özellik, Properties ' set erişimcileri içinde değiştirilir. Aşağıdaki örnek, özelliği için kodu gösterir DefaultFontFamily . Özelliği ayarlamak, çeşitli denetimlerin özelliklerini ayarlayan özel bir yöntemi çağırır FontFamily .
WPFPage. h öğesinden:
property FontFamily^ DefaultFontFamily
{
FontFamily^ get() {return _defaultFontFamily;}
void set(FontFamily^ value) {SetFontFamily(value);}
};
WPFPage. cpp öğesinden:
void WPFPage::SetFontFamily(FontFamily^ newFontFamily)
{
_defaultFontFamily = newFontFamily;
titleText->FontFamily = newFontFamily;
nameLabel->FontFamily = newFontFamily;
addressLabel->FontFamily = newFontFamily;
cityLabel->FontFamily = newFontFamily;
stateLabel->FontFamily = newFontFamily;
zipLabel->FontFamily = newFontFamily;
}