Aracılığıyla paylaş


İzlenecek yol: Win32'de WPF Barındırma

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 içeriğini barındıran bir Win32 Pencere Örneğinde WPF İçeriği Barındırma adlı örnek bir uygulamanın nasıl yazıldığı açıklanmaktadır. Bu örneği herhangi bir Win32 penceresini barındıracak şekilde genişletebilirsiniz. Yönetilen ve yönetilmeyen kodun karıştırılmasını içerdiğinden, uygulama C++/CLI dilinde yazılır.

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şlarken. Win32 programlamaya giriş için, özellikle Charles Petzold'un Programlama Pencereleri olmak üzere konuyla ilgili sayısız kitaplardan herhangi birine başvurmalısınız.

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.

Dekont

Bu öğretici, ilişkili örnekten bir dizi kod örneği içerir. Ancak okunabilirlik için örnek kodun tamamını içermez. Örnek kodun tamamı için bkz . Win32 Pencere Örneğinde WPF İçeriği Barındırma.

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.

Win32 penceresinde WPF içeriğini barındırmanın HwndSource anahtarı 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.

  1. WPF içeriğinizi yönetilen sınıf olarak uygulayın.

  2. 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ı derleyici bayrağını içerecek /clr şekilde değiştirerek yönetilen kodu çağırmasını etkinleştirebilirsiniz.

  3. İş parçacığı modelini tek iş parçacıklı daire (STA) olarak ayarlayın.

  4. Pencere yordamınızda WM_CREATEbildirimini işleyin ve aşağıdakileri yapın:

    1. Parametresi üst parent pencere olan yeni HwndSource bir nesne oluşturun.

    2. WPF içerik sınıfınızın bir örneğini oluşturun.

    3. ÖZELLIĞIne WPF içerik nesnesine RootVisual bir başvuru atayın HwndSource.

    4. İçerik için HWND'yi alın. Handle nesnesinin HwndSource özelliği pencere tutamacını (HWND) içerir. Uygulamanızın yönetilmeyen bölümünde kullanabileceğiniz bir HWND almak için bir HWND'ye yayınlanmıştır Handle.ToPointer() .

  5. 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.

  6. WPF içeriğini statik alana atayın.

  7. WPF olaylarından birine veya daha fazlasına işleyici ekleyerek WPF içeriğinden bildirim alın.

  8. Özellikleri ayarlamak için statik alanda depoladığınız başvuruyu kullanarak WPF içeriğiyle iletişim kurun.

Dekont

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. Yordamın geri kalanı yukarıda açıklanana benzer.

Konak Uygulamasını Uygulama

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 programlamadır. İçerik uygulamasının temel yönleri WPF İçeriğini Uygulama bölümünde ele alınıyor.

Temel Uygulama

Konak uygulamasının başlangıç noktası bir Visual Studio 2005 şablonu oluşturmaktı.

  1. Visual Studio 2005'i açın ve Dosya menüsünden Yeni Proje'yi seçin.

  2. Visual C++ proje türleri listesinden Win32'yi seçin. Varsayılan diliniz C++ değilse, bu proje türlerini Diğer Diller altında bulabilirsiniz.

  3. Bir Win32 Projesi şablonu seçin, projeye bir ad atayın ve Win32 Uygulama Sihirbazı'nı başlatmak için Tamam'a tıklayın.

  4. 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 pencere yordamına (WndProc) sahip bir pencere.

  • Dosya ve Yardım başlıklarını 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 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 derler. Ancak, WPF yönetilen kodda uygulandığından, projenin uygun şekilde derlenmiş olması gerekir.

  1. Çözüm Gezgini'da 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.

  2. Sol bölmedeki ağaç görünümünde Yapılandırma Özellikleri'ni seçin.

  3. Sağ bölmedeki Project Defaults listesinden Ortak Dil Çalışma Zamanı desteği'ni seçin.

  4. Açılan liste kutusundan Ortak Dil Çalışma Zamanı Desteği (/clr) öğesini seçin.

Dekont

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ı daire (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 denetimlerden oluşur. Tamam ve İptal şeklindeiki Button denetim de vardır. Kullanıcı Tamam'a tıkladığında, düğmenin Click olay işleyicisi denetimlerden TextBox verileri toplar, ilgili özelliklere atar ve özel bir olay oluşturur. OnButtonClicked Kullanıcı İptal'e tıkladığında, işleyici yalnızca öğesini yükseltirOnButtonClicked. için OnButtonClicked 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;

yöntemi boyut GetHwnd 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.

Dekont

Ad alanı için System::Windows::Interop yönerge #using kullanamazsınız. Bunun yapılması, bu ad alanı içindeki yapı ile winuser.h dosyasında bildirilen MSG yapısı arasında MSG bir ad çakışması oluşturur. Bunun yerine, bu ad alanının içeriğine erişmek için tam 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 sarmalama nesnesi oluşturursunuz HwndSource . Bu nesne temel olarak WPF içeriğini barındırmak için tasarlanmış bir penceredir. Nesneyi, uygulamanızın HwndSource bir parçası olan win32 penceresinin alt öğesi olarak oluşturarak üst pencerede barındırabilirsiniz. Oluşturucu parametreleri, HwndSource 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 ayrı bir sınıf WPFPageolarak 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.

WPF içeriğine bir başvuru atayarak alt pencerenizde WPF içeriğini RootVisualHwndSourcegörüntülersiniz.

Sonraki kod satırı WPF içerik OnButtonClicked olayına bir olay işleyicisi eklerWPFButtonClicked. Kullanıcı Tamam veya İptal düğmesine tıkladığında bu işleyici çağrılır. Bu olay işleyicisi hakkında daha fazla bilgi için bkz . communicating_with_the_WPF içeriği .

Gösterilen son kod satırı, nesneyle HwndSource 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, bir ileti işleyicisi eklemek için yöntemini çağırın AddHook ve ardından bu işleyicideki iletileri işleyin.

WPF İçeriğine Başvuru 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 nesnenin farklı WPF içeriği barındırmasını HwndSource isteyebilirsiniz. Bunu yapmak için nesneye HwndSource veya WPF içeriğine bir başvuru gerekir. Nesne HwndSource ve ilişkili WPF içeriği, siz pencere tutamacını yok edene kadar bellekte kalır. Ancak, nesneye HwndSource 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. Nesneyle HwndSource 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 sınıfını kullanır WPFPageHost . 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;
};

İşlevin GetHwnd ikinci bölümü, kapsam dahilindeyken myPage 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. Kullanıcı 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 özel bir olay bağımsız değişken nesnesi alır. MyPageEventArgs Nesnenin IsOK özelliği, Tamam düğmesine tıklandığında ve falseİptal düğmesine tıklandığında olarak ayarlanır true.

Tamam düğmesine tıklanırsa, 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, içinden WPF içeriğine (hostedPage) WPFPageHost bir başvuru alın ve arka plan rengi özelliğini uygun renge 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, sınıfında statik bir alan WPFPageHost olarak depolanır. Diğer ikisini ayarlamak için yeni SolidColorBrush bir nesne oluşturur ve oluşturucuya nesneden Colors 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.

Düzen

WPF içeriğindeki kullanıcı arabirimi öğeleri, ilişkili Label denetimlerle birlikte beş TextBox denetimden oluşur: Ad, Adres, Şehir, Eyalet ve Zip. Ayrıca tamam ve iptal etmekiçin iki Button denetim vardır

WPF içeriği sınıfında WPFPage uygulanır. Düzen bir Grid düzen öğesiyle işlenir. sınıfı öğesinden Griddevralır ve bunu etkili bir şekilde WPF içerik kök öğesi yapar.

WPF içerik oluşturucu gerekli genişlik ve yüksekliği alır ve uygun şekilde boyutlandırır Grid . Ardından bir ve nesnesi kümesi ColumnDefinition oluşturup bunları sırasıyla nesne tabanına GridColumnDefinitions ve RowDefinitions koleksiyonlarına ekleyerek temel düzeni tanımlar.RowDefinition 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 öğesine Gridekler. İlk öğe, kılavuzun ilk satırında ortalanmış bir Label denetim 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 Ad Label denetimini ve ilişkili TextBox denetimini içerir. Her etiket/metin kutusu çifti için aynı kod kullanıldığından, bir çift özel yönteme yerleştirilir ve beş etiket/metin kutusu çiftinin tümü için kullanılır. Yöntemler uygun denetimi oluşturur ve denetimleri uygun hücreye Grid yerleştirmek için sınıfı statik SetColumn ve SetRow yöntemlerini çağırır. Denetim oluşturulduktan sonra örnek, denetimi kılavuza eklemek için özelliğinde ChildrenGrid yöntemini çağırırAdd. 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 düğmelerini ekler ve olaylarına Click 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 Konak Penceresine Döndürme

Her iki düğmeye de tıklandığında, Click olayı oluşturulur. Konak penceresi yalnızca bu olaylara işleyiciler ekleyebilir ve verileri doğrudan denetimlerden TextBox alabilir. Örnek biraz daha az doğrudan yaklaşım kullanır. WPF içeriğinin içinde öğesini Click işler ve ardından WPF içeriğini 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, denetimlerden TextBox metni alır ve konağın bilgileri alabildiğ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;

Click WPFPage.cpp dosyasındaki 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ından, yalnızca özellikleri değiştirmek önemlidir. 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, özellikler kümesi erişimcilerinde her denetim için uygun özellik değiştirilir. Aşağıdaki örnekte özelliğin kodu gösterilmektedir DefaultFontFamily . özelliğinin ayarlanması, çeşitli denetimlerin 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 dosyasından:

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 bkz.