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, Win32 koduna önemli bir yatırım yaptığınızda, özgün kodunuzu yeniden yazmak yerine uygulamanıza WPF işlevselliği eklemek daha etkili olabilir. WPF, WPF içeriğini win32 penceresinde barındırmak için basit bir mekanizma sağlar.
Bu öğreticide,Win32 Penceresinde WPF İçeriği Barındırma Örneği
Gereksinimler
Bu öğreticide hem WPF hem de Win32 programlaması hakkında temel bir bilgi olduğu varsayılır. WPF programlamaya temel bir giriş için bkz Başlangıç. Win32 programlamasına giriş yapmak için, özellikle Charles Petzold tarafından yazılan Programming Windows başta olmak üzere, konu hakkında birçok kitaba başvurabilirsin.
Bu öğreticiye eşlik eden örnek C++/CLI'da uygulandığından, bu öğreticide Windows API'sini programlamak için C++ kullanımı ve yönetilen kod programlama hakkında bilgi sahibi olduğunuz varsayılır. C++/CLI hakkında bilgi sahibi olunması yararlı olur ancak gerekli değildir.
Uyarı
Bu öğretici, ilişkili örnekten bir dizi kod örneği içerir. Ancak okunabilirlik için örnek kodun tamamını içermez. Tam örnek kod için, bkz. "Win32 Penceresinde WPF İçeriği Barındırma Örneği ".
Temel Yordam
Bu bölümde, WIN32 penceresinde WPF içeriğini barındırmak için kullandığınız temel yordam özetlenmiştir. Kalan bölümlerde her adımın ayrıntıları açıklanmaktadır.
Wpf içeriğini win32 penceresinde barındırmanın anahtarı HwndSource sınıfıdır. Bu sınıf, WPF içeriğini bir Win32 penceresine kaydırarak kullanıcı arabiriminize (UI) alt pencere olarak dahil edilmesine olanak tanır. Aşağıdaki yaklaşım, Win32 ve WPF'yi tek bir uygulamada birleştirir.
WPF içeriğinizi yönetilen sınıf olarak uygulayın.
C++/CLI ile bir Windows uygulaması uygulayın. Mevcut bir uygulama ve yönetilmeyen bir C++ koduyla başlıyorsanız, genellikle proje ayarlarınızı
/clrderleyici bayrağını içerecek şekilde değiştirerek yönetilen kodu çağırmasını etkinleştirebilirsiniz.İş parçacığı modelini tek iş parçacıklı model (STA) olarak ayarlayın.
Pencere yordamınızdaki WM_CREATEbildirimini işleyin ve aşağıdakileri yapın:
Ebeveyn pencereyi HwndSource parametresi olarak alıp yeni bir
parentnesnesi oluşturun.WPF içerik sınıfınızın bir örneğini oluşturun.
RootVisual HwndSource özelliğine WPF içerik nesnesine bir referans atayın.
İçerik için HWND'yi alın. Handle nesnesinin HwndSource özelliği pencere tutamacını (HWND) içerir. Uygulamanızın yönetilmeyen kısmında kullanabileceğiniz bir HWND elde etmek için
Handle.ToPointer()'ı bir HWND'ye tür dönüştürün.
WPF içeriğinize başvuru tutmak için statik alan içeren bir yönetilen sınıf uygulayın. Bu sınıf, Win32 kodunuzdan WPF içeriğine başvuru almanızı sağlar.
WPF içeriğini statik alana atayın.
WPF olaylarından birine veya daha fazlasına işleyici ekleyerek WPF içeriğinden bildirim alın.
Statik alanda depoladığınız referansı kullanarak WPF içeriğiyle iletişim kurun ve özellikleri, ve benzeri ayarlayın.
Uyarı
WPF içeriğini de kullanabilirsiniz. Ancak, bunu ayrı bir dinamik bağlantı kitaplığı (DLL) olarak derlemeniz ve Bu DLL'ye Win32 uygulamanızdan başvurmanız gerekir. Prosedürün geri kalanı yukarıda açıklanmış olana benzer.
Ana Uygulamayı Gerçekleştirme
Bu bölümde, temel bir Win32 uygulamasında WPF içeriğinin nasıl barındırıldığı açıklanmaktadır. İçeriğin kendisi C++/CLI'da yönetilen sınıf olarak uygulanır. Çoğunlukla, basit bir WPF programlamasıdır. İçerik uygulamasının temel yönleri WPF İçeriğini Uygulamabölümünde ele alınıyor.
Temel Uygulama
Konak uygulamasının başlangıç noktası bir Visual Studio 2005 şablonu oluşturmaktı.
Visual Studio 2005'i açın ve
Dosya menüsünden Yeni Projeseçin. Visual C++ proje türleri listesinden win32
seçin. Varsayılan diliniz C++ değilse, bu proje türlerini Diğer Dilleraltında bulabilirsiniz. bir Win32 Project şablonu seçin, projeye bir ad atayın ve Win32 Uygulama Sihirbazıbaşlatmak için Tamam'a tıklayın.
Sihirbazın varsayılan ayarlarını kabul edin ve projeyi başlatmak için Son tıklayın.
Şablon aşağıdakiler dahil olmak üzere temel bir Win32 uygulaması oluşturur:
Uygulama için bir giriş noktası.
İlişkili pencere yordamına (WndProc) sahip bir pencere.
Dosya ve Yardım başlıklarına sahip 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 bir Hakkında öğesi vardır.
WPF içeriğini barındırmak için kod yazmaya başlamadan önce temel şablonda iki değişiklik yapmanız gerekir.
Birincisi, projeyi yönetilen kod olarak derlemektir. Varsayılan olarak, proje yönetilmeyen kod olarak derlenir. Ancak, WPF yönetilen kodda uygulandığından, projenin uygun şekilde derlenmiş olması gerekir.
Çözüm Gezgini proje adına sağ tıklayın ve bağlam menüsünden Özellikler'ni seçerek Özellik Sayfaları iletişim kutusunu başlatın.
Sol bölmedeki ağaç görünümünden Yapılandırma Özellikleri seçin.
Sağ bölmedeki Project Defaults listesinden Ortak Dil Çalışma Zamanı Ortamı desteğini seçin.
Açılan liste kutusundan Ortak Dil Çalışma Zamanı Desteği (/clr)
seçin.
Uyarı
Bu derleyici bayrağı, uygulamanızda yönetilen kodu kullanmanıza olanak tanır, ancak yönetilmeyen kodunuz daha önce olduğu gibi derlenmeye devam eder.
WPF, tek iş parçacıklı dağıtım (STA) iş parçacığı modelini kullanır. WPF içerik koduyla düzgün çalışmak için 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 İçeriğini Barındırma
WPF içeriği basit bir adres girişi uygulamasıdır. Kullanıcı adı, adres vb. almak için çeşitli TextBox denetimlerinden oluşur. İki Button denetimi vardır: Tamam ve İptal. Kullanıcı OK'ye tıkladığında, düğmenin Click olay işleyicisi TextBox denetimlerinden verileri toplar, ilgili özelliklere atar ve OnButtonClickedözel bir olayı tetikler. Kullanıcı İptaltıkladığında işleyici yalnızca OnButtonClickedtetikler.
OnButtonClicked için olay bağımsız değişkeni nesnesi, hangi düğmeye tıklandığını gösteren bir Boole alanı içerir.
WPF içeriğini barındırma kodu, konak penceresindeki 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;
GetHwnd yöntemi boyut ve konum bilgilerinin yanı sıra üst pencere tutamacını alır ve barındırılan WPF içeriğinin pencere tutamacını döndürür.
Uyarı
#using ad alanı için System::Windows::Interop yönergesi kullanamazsınız. Bunu yapmak, bu ad alanında MSG yapısı ile winuser.h dosyasında bildirilen 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 içeriğini doğrudan uygulama pencerenizde barındıramazsınız. Bunun yerine, önce WPF içeriğini sarmak için bir HwndSource nesnesi oluşturursunuz. Bu nesne temel olarak WPF içeriğini barındırmak için tasarlanmış bir penceredir. HwndSource nesnesini uygulamanızın parçası olan bir Win32 penceresinin alt öğesi olarak oluşturarak üst pencerede barındırabilirsiniz. HwndSource oluşturucu parametreleri, Win32 alt penceresi oluşturduğunuzda CreateWindow'a geçirdiğiniz bilgilerin çok aynısını içerir.
Bir sonraki adımda WPF içerik nesnesinin bir örneğini oluşturacaksınız. Bu durumda, WPF içeriği C++/CLI kullanılarak WPFPageayrı bir sınıf olarak uygulanır. WPF içeriğini XAML ile de uygulayabilirsiniz. Ancak bunu yapmak için ayrı bir proje ayarlamanız ve WPF içeriğini DLL olarak oluşturmanız gerekir. Projenize bu DLL'ye başvuru ekleyebilir ve wpf içeriğinin bir örneğini oluşturmak için bu başvuruyu kullanabilirsiniz.
RootVisual HwndSource özelliğine WPF içeriğine bir başvuru atayarak ALT pencerenizde WPF içeriğini görüntülersiniz.
Sonraki kod satırı WPF içeriği WPFButtonClicked olayına OnButtonClickedbir olay işleyicisi ekler. Kullanıcı Tamam veya İptal düğmesine tıkladığında bu işleyici çağrılır. Bu olay işleyicisinin daha fazla tartışılması için communicating_with_the_WPF içeriği bölümüne bakın.
Gösterilen son kod satırı, HwndSource nesnesiyle ilişkili pencere tutamacını (HWND) döndürür. Örnek bunu yapmasa da, barındırılan pencereye ileti göndermek için Win32 kodunuzdaki bu tanıtıcıyı kullanabilirsiniz. HwndSource nesnesi her ileti aldığında bir olay oluşturur. İletileri işlemek için AddHook yöntemini çağırarak bir ileti işleyicisi ekleyin ve ardından iletileri bu işleyicide işleyin.
WPF İçeriğine Referans Tutma
Birçok uygulama için WPF içeriğiyle daha sonra iletişim kurmak isteyeceksiniz. Örneğin, WPF içerik özelliklerini değiştirmek veya HwndSource nesnesinin farklı WPF içeriği barındırmasını isteyebilirsiniz. Bunu yapmak için HwndSource nesnesine veya WPF içeriğine bir başvuru gerekir. HwndSource nesnesi ve ilişkili WPF içeriği, siz pencere tutamacını yok edene kadar bellekte kalır. Ancak, HwndSource nesnesine atadığınız değişken, pencere yordamından döner dönmez kapsamın dışına çıkar. Win32 uygulamalarında bu sorunu işlemenin özel yolu statik veya genel değişken kullanmaktır. Ne yazık ki, yönetilen bir nesneyi bu tür değişkenlere atayamazsınız. HwndSource nesnesiyle ilişkili pencere tutamacını genel veya statik bir değişkene atayabilirsiniz, ancak nesnenin kendisine erişim sağlamaz.
Bu sorunun en basit çözümü, erişmeniz gereken tüm yönetilen nesnelere başvuruları tutmak için bir dizi statik alan içeren bir yönetilen sınıf uygulamaktır. Örnek, WPF içeriğine bir başvuruyu ve daha sonra kullanıcı tarafından değiştirilebilen bir dizi özelliğinin başlangıç değerlerini tutmak için WPFPageHost sınıfını kullanır. Bu, üst bilgide tanımlanı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;
};
GetHwnd işlevinin ikinci bölümü, myPage hala kapsam dahilindeyken daha sonra kullanmak üzere bu alanlara değerler atar.
WPF İçeriğiyle İletişim Kurma
WPF içeriğiyle iki tür iletişim vardır. Tamam veya İptal düğmelerine tıkladığında, uygulama WPF içeriğinden bilgi alır. Uygulamanın ayrıca kullanıcının arka plan rengi veya varsayılan yazı tipi boyutu gibi çeşitli WPF içerik özelliklerini değiştirmesine olanak tanıyan bir kullanıcı arabirimi de vardır.
Yukarıda belirtildiği gibi, kullanıcı herhangi bir düğmeye tıkladığında WPF içeriği bir OnButtonClicked olayı oluşturur. Uygulama, bu bildirimleri almak için bu olaya bir işleyici ekler.
Tamam düğmesine tıklanırsa, işleyici WPF içeriğinden kullanıcı bilgilerini alır ve bir dizi statik denetimde 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, WPF içeriğinden MyPageEventArgsözel bir olay bağımsız değişken nesnesi alır. nesnenin IsOK özelliği, true düğmesine tıklandığında olarak ayarlanır ve false düğmesine tıklandığında .
Tamam düğmesine tıklanmışsa, işleyici kapsayıcı sınıfından WPF içeriğine bir başvuru alır. Ardından ilişkili WPF içerik özellikleri tarafından tutulan kullanıcı bilgilerini toplar ve üst pencerede bilgileri görüntülemek için statik denetimleri kullanır. WPF içerik verileri yönetilen dize biçiminde olduğundan, win32 denetimi tarafından kullanılmak üzere sıralanmalıdır. İptal düğmesine tıklanırsa, işleyici statik denetimlerden verileri temizler.
Uygulama kullanıcı arabirimi, kullanıcının WPF içeriğinin arka plan rengini ve yazı tipiyle ilgili birkaç özelliği değiştirmesine olanak sağlayan bir dizi radyo düğmesi sağlar. Aşağıdaki örnek, uygulamanın pencere yordamından (WndProc) ve arka plan rengi de dahil olmak üzere farklı iletilerde çeşitli özellikleri ayarlayan ileti işlemesinden bir alıntıdır. Diğerleri benzerdir ve gösterilmez. 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, hostedPage'den WPF içeriğine (WPFPageHost) bir referans alın ve arka plan rengi özelliğini uygun renkle ayarlayın. Örnekte üç renk seçeneği kullanılır: orijinal renk, açık yeşil veya açık somon. Özgün arka plan rengi, WPFPageHost sınıfında statik bir alan olarak depolanır. Diğer ikisini ayarlamak için yeni bir SolidColorBrush nesnesi oluşturur ve oluşturucuya Colors nesnesinden statik bir renk değeri geçirirsiniz.
WPF Sayfasını Uygulama
GERÇEK uygulama hakkında herhangi bir bilginiz olmadan WPF içeriğini barındırabilir ve kullanabilirsiniz. WPF içeriği 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++/CLI uygulamasının kısa bir kılavuzu verilmiştir. Bu bölüm aşağıdaki alt bölümleri içerir.
Tasarım Düzeni
WPF içeriğindeki ui öğeleri, ilişkili TextBox denetimleriyle beş Label denetiminden oluşur: Ad, Adres, Şehir, Eyalet ve Zip. Ayrıca iki Button denetimi, Tamam ve İptal vardır.
WPF içeriği WPFPage sınıfında uygulanır. Düzen, Grid düzen öğesiyle yönetilir. Sınıf, Grid'den devralır ve böylece WPF içerik kök öğesi haline gelir.
WPF içerik oluşturucu gerekli genişlik ve yüksekliği alır ve Grid uygun şekilde boyutlandırır. Ardından bir dizi ColumnDefinition ve RowDefinition nesnesi oluşturup bunları sırasıyla Grid nesne tabanı ColumnDefinitions ve RowDefinitions koleksiyonlarına ekleyerek temel düzeni tanımlar. Bu, beş satırdan ve yedi sütundan oluşan bir kılavuz tanımlar ve boyutları hücrelerin içeriği tarafından belirlenir.
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]);
}
Ardından oluşturucu, kullanıcı arabirimi öğelerini Grid'a ekler. İlk öğe, kılavuzun ilk satırında ortalanmış bir Label denetimi olan başlık metnidir.
//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 Name Label denetimini ve ilişkili TextBox denetimini içerir. Her etiket/metin kutusu çifti için aynı kod kullanıldığından, bu kod bir çift özel yönteme yerleştirilmiştir ve beş etiket/metin kutusu çiftinin tamamı için kullanılmaktadır. Yöntemler uygun denetimi oluşturur ve denetimleri uygun hücreye yerleştirmek için Grid sınıfı statik SetColumn ve SetRow yöntemlerini çağırır. Denetim oluşturulduktan sonra örnek, denetimi kılavuza eklemek için AddChildren özelliğinde Grid yöntemini çağırır. Kalan etiket/metin kutusu çiftlerini ekleme kodu 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 İptal Et düğmelerini ekler ve bunların Click olaylarına bir olay işleyicisi ekler.
//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);
Verileri Ana Pencereye Geri Döndürme
Her iki düğmeye de tıklandığında, Click olayı tetiklenir. Ev sahibi pencere, bu olaylara işleyiciler bağlayabilir ve verileri doğrudan TextBox kontrollerinden alabilir. Örnek biraz daha az doğrudan yaklaşım kullanır. WPF içeriğindeki Click'ı ele alır ve ardından WPF içeriğine bildirmek için özel bir olay OnButtonClickedoluşturur. Bu, WPF içeriğinin konağa bildirmeden önce bazı parametre doğrulamaları yapmasına olanak tanır. İşleyici, TextBox denetimlerinden metni alır ve ana bilgisayarın bilgileri alabileceği ortak özelliklere atar.
WPFPage.h dosyasındaki olay bildirimi:
public:
delegate void ButtonClickHandler(Object ^, MyPageEventArgs ^);
WPFPage();
WPFPage(int height, int width);
event ButtonClickHandler ^OnButtonClicked;
WPFPage.cpp dosyasındaki Click 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 konağı, kullanıcının çeşitli WPF içerik özelliklerini değiştirmesine olanak tanır. Win32 tarafında, bu yalnızca özellikleri değiştirmek meselesidir. WPF içerik sınıfındaki uygulama biraz daha karmaşıktır, çünkü tüm denetimler için yazı tiplerini denetleen tek bir genel özellik yoktur. Bunun yerine, özellik kümesinin erişimcilerinde her denetim için uygun özellik değiştirilir. Aşağıdaki örnekte DefaultFontFamily özelliğinin kodu gösterilmektedir. özelliğinin ayarlanması, çeşitli denetimler için FontFamily özelliklerini ayarlayan özel bir yöntemi çağırır.
WPFPage.h'den:
property FontFamily^ DefaultFontFamily
{
FontFamily^ get() {return _defaultFontFamily;}
void set(FontFamily^ value) {SetFontFamily(value);}
};
WPFPage.cpp'den:
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;
}
Ayrıca bakınız
- HwndSource
- WPF ve Win32 Etkileşimi
.NET Desktop feedback