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.
XAML denetimine etkili bir şekilde bağlanabilen bir özellik , gözlemlenebilir özellik olarak bilinir. Bu fikir, gözlemci deseni olarak bilinen yazılım tasarım desenini temel alır. Bu konu C ++/WinRT'de gözlemlenebilir özelliklerin nasıl uygulanacağını ve bunlara XAML denetimlerinin nasıl bağlanacağını gösterir (arka plan bilgileri için bkz . Veri bağlama).
Önemli
C++/WinRT ile çalışma zamanı sınıflarını kullanma ve yazma hakkında bilginizi destekleyen temel kavramlar ve terimler için bkz. C++/WinRT ile API'leri kullanma ve C++/WinRT ile API'leri yazma.
Gözlemlenebilir bir özellik için ne anlama gelir?
BookSku adlı bir çalışma zamanı sınıfının Title adlı bir özelliği olduğunu varsayalım. BookSku, Title değeri her değiştiğinde INotifyPropertyChanged::P ropertyChanged olayını başlatırsa, bu, Title'ın gözlemlenebilir bir özellik olduğu anlamına gelir. BookSku'nun davranışı (olayı tetikleyip tetiklememesi), varsa özelliklerinden hangilerinin gözlemlenebilir olduğunu belirler.
Bir XAML metin öğesi veya denetimi bu olaylara bağlanabilir ve bunları işleyebilir. Böyle bir öğe veya denetim, güncelleştirilmiş değerleri alarak ve ardından yeni değeri gösterecek şekilde kendisini güncelleştirerek olayı işler.
Note
C++/WinRT Visual Studio Uzantısını (VSIX) ve NuGet paketini (birlikte proje şablonu ve derleme desteği sağlayan) yükleme ve kullanma hakkında bilgi için bkz. C++/WinRT için Visual Studio desteği.
Boş Bir Uygulama Oluştur (Kitabevi)
Microsoft Visual Studio'da yeni bir proje oluşturarak başlayın. C++ projesi olarak Boş Uygulama, Paketlenmiş (Masaüstünde WinUI 3) oluşturun ve adını Bookstore koyun. Çözümü ve projeyi aynı dizine yerleştir seçeneğinin işaretinin kaldırıldığından emin olun. Windows SDK'sının genel kullanıma sunulan (önizleme değil) en son sürümünü hedefleyin.
Gözlemlenebilir başlık özelliğine sahip bir kitabı temsil eden yeni bir sınıf yazacağız. Sınıfı aynı derleme birimi içinde hem tanımlıyor hem de kullanıyoruz. Ancak bu sınıfa XAML'den bağlanabilmek istiyoruz ve bu nedenle bir çalışma zamanı sınıfı olacak. Hem yazmak hem de kullanmak için C++/WinRT kullanacağız.
Yeni bir çalışma zamanı sınıfı yazmanın ilk adımı, projeye yeni bir Midl Dosyası (.idl) öğesi eklemektir. yeni öğeyi BookSku.idladlandırın.
BookSku.idl öğesinin varsayılan içeriğini silin ve bunun yerine bu çalışma zamanı sınıf bildirimini yapıştırın.
// BookSku.idl
namespace Bookstore
{
runtimeclass BookSku : Microsoft.UI.Xaml.Data.INotifyPropertyChanged
{
BookSku(String title);
String Title;
}
}
Note
Görünüm modeli sınıflarınızın (aslında, uygulamanızda bildirdiğiniz herhangi bir çalışma zamanı sınıfı) temel sınıftan türetilmemesi gerekir. Yukarıda bildirilen BookSku sınıfı bunun bir örneğidir. Bir arabirim uygular, ancak herhangi bir temel sınıftan türetilmez.
Bir temel sınıftan türetilen uygulamada bildirdiğiniz herhangi bir çalışma zamanı sınıfı, birleştirilebilir sınıf olarak bilinir. Ve birleştirilebilir sınıflar ile ilgili kısıtlamalar vardır. Bir uygulamanın, Visual Studio ve Microsoft Store tarafından gönderileri doğrulamak için kullanılan Windows Uygulama Sertifikasyon Seti testlerini geçirmesi için (ve bu nedenle uygulamanın Microsoft Store'a başarıyla alınması için), bir oluşturulabilir sınıfın sonuçta bir Windows temel sınıfından türetilmesi gerekir. Yani devralma hiyerarşisinin kökündeki sınıfın Windows.* veya Microsoft.* ad alanından kaynaklanan bir tür olması gerekir. Temel bir sınıftan bir çalışma zamanı sınıfı türetmeniz gerekirse — örneğin, tüm görünüm modellerinizin türediği bir BindableBase sınıfı oluşturmak için — Microsoft.UI.Xaml.DependencyObject sınıfından türetebilirsiniz.
Görünüm modeli bir görünümün soyutlamasıdır ve bu nedenle doğrudan görünüme (XAML işaretlemesi) bağlıdır. Veri modeli verilerin soyutlamasıdır ve yalnızca görünüm modellerinden kullanılır ve doğrudan XAML'ye bağlı değildir. Böylece veri modellerinizi çalışma zamanı sınıfları olarak değil, C++ yapıları veya sınıfları olarak bildirebilirsiniz. Bunların MIDL'de bildirilmesi gerekmez ve istediğiniz devralma hiyerarşisini kullanabilirsiniz.
Dosyayı kaydedin ve projeyi oluşturun. Derleme işlemi şimdilik (tam olarak) başarıyla tamamlanmayacak, ancak bizim için gerekli bazı işlemleri gerçekleştirecek. Özellikle, derleme işlemi sırasında midl.exe aracı, çalışma zamanı sınıfını açıklayan bir Windows Çalışma Zamanı meta veri dosyası oluşturmak için çalıştırılır (dosya diskte \Bookstore\Debug\Bookstore\Unmerged\BookSku.winmd konumuna yerleştirilir). Ardından, cppwinrt.exe çalışma zamanı sınıfınızı yazma ve kullanma konusunda sizi desteklemek üzere kaynak kod dosyaları oluşturmak için araç çalıştırılır. Bu dosyalar, IDL'nizde bildirdiğiniz BookSku çalışma zamanı sınıfını uygulamaya başlamanızı sağlayan saplamalar içerir. Bunları birazdan diskte bulacağız, ama bu taslaklar \Bookstore\Bookstore\Generated Files\sources\BookSku.h ve BookSku.cpp.
Şimdi Visual Studio proje düğümüne sağ tıklayın ve Dosya Gezgini'nde Klasörü Aç'a tıklayın. Bu işlem, proje klasörünü Dosya Gezgini'nde açar. Şu anda \Bookstore\Bookstore\ klasörünün içeriğini görüyor olmalısınız. Buradan \Generated Files\sources\ klasörüne gidin ve BookSku.h ile BookSku.cpp saplama dosyalarını panoya kopyalayın. Proje klasörüne (\Bookstore\Bookstore\) geri dönün ve az önce kopyaladığınız iki dosyayı yapıştırın. Son olarak Çözüm Gezgini içinde proje düğümü seçili durumdayken Tüm Dosyaları Göster seçeneğinin açık olduğundan emin olun. Kopyaladığınız taslak dosyalarına sağ tıklayın ve Projeye Dahil Et'e tıklayın.
BookSku'yu uygulayın
Şimdi çalışma zamanı sınıfımızı açıp \Bookstore\Bookstore\BookSku.hBookSku.cpp uygulayalım. İlk olarak, BookSku.h ve BookSku.cpp öğelerinin üst kısmında bir static_assert görürsünüz; bunu kaldırmanız gerekir.
Ardından, içinde BookSku.hbu değişiklikleri yapın.
- Varsayılan oluşturucuda
= defaultifadesini= deleteolarak değiştirin. Çünkü varsayılan bir oluşturucu istemiyoruz. - Başlık dizesini depolamak için özel bir üye ekleyin. Winrt::hstring değerini alan bir oluşturucumuz olduğunu unutmayın. Bu değer başlık dizesidir.
- Başlık değiştiğinde oluşturacağımız olay için başka bir özel üye ekleyin.
Bu değişiklikleri yaptıktan sonra, BookSku.h öğeniz şöyle görünecektir.
// BookSku.h
#pragma once
#include "BookSku.g.h"
namespace winrt::Bookstore::implementation
{
struct BookSku : BookSkuT<BookSku>
{
BookSku() = delete;
BookSku(winrt::hstring const& title);
winrt::hstring Title();
void Title(winrt::hstring const& value);
winrt::event_token PropertyChanged(Microsoft::UI::Xaml::Data::PropertyChangedEventHandler const& value);
void PropertyChanged(winrt::event_token const& token);
private:
winrt::hstring m_title;
winrt::event<Microsoft::UI::Xaml::Data::PropertyChangedEventHandler> m_propertyChanged;
};
}
namespace winrt::Bookstore::factory_implementation
{
struct BookSku : BookSkuT<BookSku, implementation::BookSku>
{
};
}
içinde BookSku.cpp, aşağıdaki gibi işlevleri uygulayın.
// BookSku.cpp
#include "pch.h"
#include "BookSku.h"
#include "BookSku.g.cpp"
namespace winrt::Bookstore::implementation
{
BookSku::BookSku(winrt::hstring const& title) : m_title{ title }
{
}
winrt::hstring BookSku::Title()
{
return m_title;
}
void BookSku::Title(winrt::hstring const& value)
{
if (m_title != value)
{
m_title = value;
m_propertyChanged(*this, Microsoft::UI::Xaml::Data::PropertyChangedEventArgs{ L"Title" });
}
}
winrt::event_token BookSku::PropertyChanged(Microsoft::UI::Xaml::Data::PropertyChangedEventHandler const& handler)
{
return m_propertyChanged.add(handler);
}
void BookSku::PropertyChanged(winrt::event_token const& token)
{
m_propertyChanged.remove(token);
}
}
Title değiştirici işlevinde, mevcut değerden farklı bir değerin atanıp atanmadığını denetleriz. Ve eğer öyleyse, başlığı güncelleriz ve ayrıca INotifyPropertyChanged::PropertyChanged olayını, değişen özelliğin adına eşit bir bağımsız değişkenle tetikleriz. Bu, kullanıcı arabiriminin (UI) hangi özelliğin değerinin yeniden sorgulandığını bilmesi için yapılır.
İsterseniz şimdi projenin yeniden derleneceğini kontrol edebilirsiniz.
BookstoreViewModel'i tanımlayın ve uygulayın
Ana XAML sayfamız bir ana görünüm modeline bağlanacak. Bu görünüm modeli, BookSku türünden biri de dahil olmak üzere çeşitli özelliklere sahip olacak. Bu adımda, ana görünüm modeli çalışma zamanı sınıfımızı bildirip uygulayacağız.
adlı yeni bir BookstoreViewModel.idl öğesi ekleyin. Ancak Çalışma zamanı sınıflarını Midl dosyalarına (.idl) ayırma konusuna da bakın.
// BookstoreViewModel.idl
import "BookSku.idl";
namespace Bookstore
{
runtimeclass BookstoreViewModel
{
BookstoreViewModel();
BookSku BookSku{ get; };
}
}
Kaydedin ve derleyin (derleme henüz tamamen başarılı olmayacak, ancak derlememizin nedeni saplama dosyalarını yeniden oluşturmaktır).
Generated Files\sources klasöründeki BookstoreViewModel.h ve BookstoreViewModel.cpp öğelerini proje klasörüne kopyalayın ve bunları projeye ekleyin. Bu dosyaları açın (yeniden kaldırarak static_assert ) ve çalışma zamanı sınıfını aşağıda gösterildiği gibi uygulayın.
BookstoreViewModel.h içinde, BookSku için uygulama türünü (winrt::Bookstore::implementation::BookSku) bildiren BookSku.h öğesini dahil ettiğimize dikkat edin. Ve = default öğesini varsayılan oluşturucudan kaldırıyoruz.
Note
BookstoreViewModel.h ve BookstoreViewModel.cpp için aşağıdaki listelemelerde, kod m_bookSku veri üyesinin varsayılan oluşturulma biçimini gösterir. Bu yöntem, C++/WinRT'nin ilk sürümüne kadar uzanır ve en azından deseni tanımak iyi bir fikirdir. C++/WinRT sürüm 2.0 ve üzeri ile, tekdüzen yapı olarak bilinen iyileştirilmiş bir yapı biçimi mevcuttur ( bkz. C++/WinRT 2.0'da Haberler ve değişiklikler). Bu konunun ilerleyen bölümlerinde tekdüzen yapı örneği göstereceğiz.
// BookstoreViewModel.h
#pragma once
#include "BookstoreViewModel.g.h"
#include "BookSku.h"
namespace winrt::Bookstore::implementation
{
struct BookstoreViewModel : BookstoreViewModelT<BookstoreViewModel>
{
BookstoreViewModel();
Bookstore::BookSku BookSku();
private:
Bookstore::BookSku m_bookSku{ nullptr };
};
}
namespace winrt::Bookstore::factory_implementation
{
struct BookstoreViewModel : BookstoreViewModelT<BookstoreViewModel, implementation::BookstoreViewModel>
{
};
}
// BookstoreViewModel.cpp
#include "pch.h"
#include "BookstoreViewModel.h"
#include "BookstoreViewModel.g.cpp"
namespace winrt::Bookstore::implementation
{
BookstoreViewModel::BookstoreViewModel()
{
m_bookSku = winrt::make<Bookstore::implementation::BookSku>(L"Atticus");
}
Bookstore::BookSku BookstoreViewModel::BookSku()
{
return m_bookSku;
}
}
Note
türü m_bookSku , öngörülen türdür (winrt::Bookstore::BookSku) ve winrt::make ile kullandığınız şablon parametresi uygulama türüdür (winrt::Bookstore::implementation::BookSku). Yine de, make yansıtılan türde bir örnek döndürür.
Proje şimdi yeniden derlenecek.
MainPage'eBookstoreViewModel türünde bir özellik ekleme
ana kullanıcı arabirimi sayfamızı temsil eden çalışma zamanı sınıfını bildiren dosyasını açın MainPage.idl.
-
BookstoreViewModel.idlöğesini içe aktarmak için birimportyönergesi ekleyin. - BookstoreViewModel türünde MainViewModel adlı salt okunur bir özellik ekleyin.
- MyProperty özelliğini kaldırın.
// MainPage.idl
import "BookstoreViewModel.idl";
namespace Bookstore
{
runtimeclass MainPage : Microsoft.UI.Xaml.Controls.Page
{
MainPage();
BookstoreViewModel MainViewModel{ get; };
}
}
Dosyayı kaydedin. Proje henüz derlemede tam olarak başarılı olmayacaktır, ancak MainPage çalışma zamanı sınıfının (\Bookstore\Bookstore\Generated Files\sources\MainPage.h ve MainPage.cpp) uygulandığı kaynak kod dosyalarını yeniden oluşturacağından şimdi derlemek yararlı bir işlemdir. Haydi, şimdi derlemeye başlayın. Bu aşamada görmeyi bekleyebileceğiniz derleme hatası :'MainViewModel': 'winrt::Bookstore::implementation::MainPage' üyesi değil.
BookstoreViewModel.idl dahil etme ifadesini atlarsanız (yukarıdaki MainPage.idl listesine bakın), "MainViewModel" yakınında < bekleniyor hatasını görürsünüz. Bir diğer ipucu da tüm türleri aynı ad alanında (kod listelerinde gösterilen ad alanı) bıraktığınıza emin olmaktır.
Görmeyi beklediğimiz hatayı gidermek için artık MainViewModel özelliğinin erişimci iskeletlerini oluşturulan dosyalardan (\Bookstore\Bookstore\Generated Files\sources\MainPage.h ve MainPage.cpp) kopyalayıp \Bookstore\Bookstore\MainPage.h ve MainPage.cpp içine yapıştırmanız gerekecek. Bunu yapmak için gereken adımlar aşağıda açıklanmıştır.
\Bookstore\Bookstore\MainPage.h içinde bu adımları gerçekleştirin.
- Include
BookstoreViewModel.h, BookstoreViewModel için uygulama türünü bildirir; bu da winrt::Bookstore::implementation::BookstoreViewModel'dir. - Görünüm modelini depolamak için özel bir üye ekleyin. Özellik erişim fonksiyonunun (ve m_mainViewModel üyesinin), BookstoreViewModel için yansıtılan tür (Bookstore::BookstoreViewModel) cinsinden gerçekleştirildiğini unutmayın.
- Gerçekleştirim türü, uygulamayla aynı projede (derleme birimi) bulunduğundan, m_mainViewModel öğesini std::nullptr_t parametresini alan kurucu aşırı yüklemesi aracılığıyla oluştururuz.
- MyProperty özelliğini kaldırın.
Note
Aşağıdaki MainPage.h ve MainPage.cpp için olan iki listede kod, m_mainViewModel veri üyesinin varsayılan olarak nasıl oluşturulduğunu gösterir. Aşağıdaki bölümde bunun yerine tekdüzen yapı kullanan bir sürüm göstereceğiz.
// MainPage.h
...
#include "BookstoreViewModel.h"
...
namespace winrt::Bookstore::implementation
{
struct MainPage : MainPageT<MainPage>
{
MainPage();
Bookstore::BookstoreViewModel MainViewModel();
void ClickHandler(Windows::Foundation::IInspectable const&, Microsoft::UI::Xaml::RoutedEventArgs const&);
private:
Bookstore::BookstoreViewModel m_mainViewModel{ nullptr };
};
}
...
'de \Bookstore\Bookstore\MainPage.cpp, aşağıdaki listede gösterildiği gibi aşağıdaki değişiklikleri yapın.
- Yansıtılan BookstoreViewModel türünün yeni bir örneğini m_mainViewModel atamak için winrt::make öğesini (BookstoreViewModel uygulama türüyle) çağırın. Yukarıda gördüğümüz gibi, BookstoreViewModel oluşturucusu, özel veri üyesi olarak yeni bir BookSku nesnesi oluşturur ve başlığını başlangıçta
L"Atticus"olarak ayarlar. - Düğmenin olay işleyicisinde (ClickHandler), kitabın başlığını yayımlanan başlığıyla güncelleştirin.
- MainViewModel özelliği için erişimciyi uygulayın.
- MyProperty özelliğini kaldırın.
// MainPage.cpp
#include "pch.h"
#include "MainPage.h"
#include "MainPage.g.cpp"
using namespace winrt;
using namespace Microsoft::UI::Xaml;
namespace winrt::Bookstore::implementation
{
MainPage::MainPage()
{
m_mainViewModel = winrt::make<Bookstore::implementation::BookstoreViewModel>();
InitializeComponent();
}
void MainPage::ClickHandler(Windows::Foundation::IInspectable const& /* sender */, Microsoft::UI::Xaml::RoutedEventArgs const& /* args */)
{
MainViewModel().BookSku().Title(L"To Kill a Mockingbird");
}
Bookstore::BookstoreViewModel MainPage::MainViewModel()
{
return m_mainViewModel;
}
}
Tek tip inşaat
winrt::make yerine tekdüzen yapı kullanmak için, MainPage.h aşağıda gösterildiği gibi yalnızca bir adımda m_mainViewModel bildirin ve başlatın.
// MainPage.h
...
#include "BookstoreViewModel.h"
...
struct MainPage : MainPageT<MainPage>
{
...
private:
Bookstore::BookstoreViewModel m_mainViewModel;
};
...
Ardından, içindeki MainPage oluşturucusunda MainPage.cppkoduna m_mainViewModel = winrt::make<Bookstore::implementation::BookstoreViewModel>();gerek yoktur.
Tekdüzen oluşturma ve kod örnekleri hakkında daha fazla bilgi için bkz. Tekdüzen yapıyı kabul etme ve doğrudan uygulama erişimi.
Düğmeyi Title özelliğine bağlama
ana kullanıcı arabirimi sayfamız için XAML işaretlemesini içeren MainPage.xamlaçın. Aşağıdaki listede gösterildiği gibi, düğmeden adı kaldırın ve content özelliği değerini değişmez değerden bağlama ifadesi olarak değiştirin.
Mode=OneWay Bağlama ifadesinde (görünüm modelinden kullanıcı arabirimine tek yönlü) özelliğini not edin. Bu özellik olmadan, kullanıcı arabirimi özellik değişikliği olaylarına yanıt vermez.
<Button Click="ClickHandler" Content="{x:Bind MainViewModel.BookSku.Title, Mode=OneWay}"/>
Şimdi projeyi oluşturun ve çalıştırın. Click olay işleyicisini yürütmek için düğmeye tıklayın. Bu işleyici kitabın başlık mutator işlevini çağırır; bu mutator, kullanıcı arabirimine Title özelliğinin değiştiğini bildirmek için bir olay oluşturur; ve düğme, kendi İçerik değerini güncelleştirmek için bu özelliğin değerini yeniden sorgular.
C++/WinRT ile {Binding} işaretleme uzantısını kullanma
Şu anda yayımlanan C++/WinRT sürümü için {Binding} işaretleme uzantısını kullanabilmek için ICustomPropertyProvider ve ICustomProperty arabirimlerini uygulamanız gerekir.
Öğeden öğeye bağlama
Bir XAML öğesinin özelliğini başka bir XAML öğesinin özelliğine bağlayabilirsiniz. Bunun işaretlemede nasıl göründüğüne dair bir örnek aşağıda verilmiştır.
<TextBox x:Name="myTextBox" />
<TextBlock Text="{x:Bind myTextBox.Text, Mode=OneWay}" />
Adlandırılmış XAML varlığını myTextBox Midl dosyanızda (.idl) salt okunur bir özellik olarak bildirmeniz gerekir.
// MainPage.idl
runtimeclass MainPage : Microsoft.UI.Xaml.Controls.Page
{
MainPage();
Microsoft.UI.Xaml.Controls.TextBox myTextBox{ get; };
}
İşte bu gerekliliğin nedeni. XAML derleyicisinin doğrulaması gereken tüm türler ({x:Bind} içinde kullanılanlar dahil) Windows Meta Verilerinden (WinMD) okunur. Tek yapmanız gereken Midl dosyanıza salt okunur özelliği eklemektir. Bunu uygulamayın, çünkü otomatik olarak oluşturulan XAML arka plandaki kod sizin için uygulamayı sağlar.
XAML biçimlendirmesinden nesneleri kullanma
XAML {x:Bind} işaretleme uzantısı kullanılarak kullanılan tüm varlıklar IDL'de genel kullanıma sunulmalıdır. Ayrıca, XAML işaretlemesi aynı zamanda işaretlemede olan başka bir öğeye başvuru içeriyorsa, bu işaretlemenin alıcısı IDL'de mevcut olmalıdır.
<Page x:Name="MyPage">
<StackPanel>
<CheckBox x:Name="UseCustomColorCheckBox" Content="Use custom color"
Click="UseCustomColorCheckBox_Click" />
<Button x:Name="ChangeColorButton" Content="Change color"
Click="{x:Bind ChangeColorButton_OnClick}"
IsEnabled="{x:Bind UseCustomColorCheckBox.IsChecked.Value, Mode=OneWay}"/>
</StackPanel>
</Page>
ChangeColorButton öğesi bağlama aracılığıyla UseCustomColorCheckBox öğesine başvurur. Bu nedenle bu sayfanın IDL'sinin bağlama için erişilebilir olması için UseCustomColorCheckBox adlı salt okunur bir özellik bildirmesi gerekir.
UseCustomColorCheckBox için tıklama olay işleyicisi temsilcisi klasik XAML temsilci söz dizimini kullanır, böylece IDL'de bir giriş gerekmez; yalnızca uygulama sınıfınızda genel olması gerekir. Öte yandan, ChangeColorButton ayrıca IDL'ye de eklenmesi gereken bir {x:Bind} tıklama olayı işleyicisine sahiptir.
runtimeclass MyPage : Microsoft.UI.Xaml.Controls.Page
{
MyPage();
// These members are consumed by binding.
void ChangeColorButton_OnClick();
Microsoft.UI.Xaml.Controls.CheckBox UseCustomColorCheckBox{ get; };
}
UseCustomColorCheckBox özelliği için bir uygulama sağlamanız gerekmez. XAML kod oluşturucu bunu sizin için yapar.
Boolean’a bağlama
Bunu bir tanılama modunda yapabilirsiniz:
<TextBlock Text="{Binding CanPair}"/>
Bu, C++/CX’te true veya false olarak görüntülenir; ancak C++/WinRT’te Windows.Foundation.IReference`1<Boolean> olarak görüntülenir.
Bunun yerine, Boole'a bağlarken kullanın x:Bind .
<TextBlock Text="{x:Bind CanPair}"/>
Windows Uygulama Kitaplıklarını (WIL) Kullanma
Windows Uygulama Kitaplıkları (WIL), bağlanabilir özellikler yazmayı kolaylaştırmak için yardımcılar sağlar. WIL belgelerindeki Bildirim Yapan Özellikler bölümüne bakın.
Önemli API'ler
İlgili konular
Windows developer