Masaüstü uygulamalarında WinUI 3'e derinlemesine bir bakış

  • History |
  • |
  • 0 Yorum

XAML Islands, geliştiricilerin masaüstü (Win32) uygulamalarında UWP XAML kullanmalarını sağlayan ilk çözümümüzdü. XAML Islands'ın piyasaya sürülmesinden sonraki birkaç ay içinde, davranışsal içgörüler ve müşteri görüşmeleri, geliştiricilerin onu nasıl kullandığına dair bazı sinyaller verdi. Önemli sayıda uygulamanın tüm kullanıcı arayüzü için XAML kullandığını keşfettik; aslında, birçok uygulama yalnızca XAML'yi barındırmak amacıyla WPF'nin Window ve Windows Forms'un Form sınıflarını kullanıyordu. Ayrıca görüşmeler, C++ Windows geliştiricilerinin MFC'nin yerine XAML ile ilgilendiğini ortaya koydu.
Bu, müşterilere daha fazla yardımcı olup olamayacağımızı düşünmemize neden oldu. Windows geliştiricilerinin ne beklediğine dair bir dizi hipotez listeledik ve bu hipotezleri doğrulamak/geçersiz kılmak için bir prototip oluşturduk. Bu doğrulama sürecinin sonucu çok aydınlatıcı oldu. Windows geliştiricileri, halihazırda kullanmakta oldukları masaüstü kodunu (.NET veya C++ Win32 biçiminde) yeniden kullanarak güzel, modern ve canlandırıcı uygulamalar oluşturmaya açlardı. Çoğu durumda, bu kodun güvenlik sanal alanının (AppContainer) dışında çalışması ve piyasadaki tüm Windows 10 sürümlerinde çalışması gerekiyordu. Bu yüzden WinUI 3'ü UWP uygulamalarına ek olarak masaüstü uygulamalarını destekleyecek şekilde genişlettik. WinUI 3.0 Preview 1, tüm kullanıcı arayüzünün pencereler, kontroller,
Ama bu kadar gevezelik yeter ve işe koyulalım! Bu blog gönderisinde WinUI 3 Preview 1 ve .NET ile bir masaüstü uygulaması oluşturmaya odaklanacağım ve gelecek gönderiler için C++'ı bırakacağım.
İlk adım, geliştirme makinenize WinUI3 Önizleme 1'i (veya varsa Önizleme 2'yi) yüklemektir. Proje şablonlarını içeren VSIX'i indirmek ve kurmak için bu bağlantıyı ziyaret etmenizi ve Ön Koşullar talimatlarını izlemenizi öneririm. Bundan sonra, C# ve .NET 5 için bir WinUI 3 masaüstü uygulaması oluşturma talimatlarını izleyin. F5 tuşuna basın, şöyle bir şey göreceksiniz:

Ekrandaki metin.
Bir satır kod yazmadan bu projeden öğrenebileceğiniz çok şey var. İlk göze çarpan şey, çözümde iki projenin olmasıdır. Biri Desktop WinUI 3 uygulamasının kendisi için, diğeri ise uygulamayı bir MSIX'e paketlemek içindir. Önizleme 1'de, uygulamanızı çalıştırmak için projenizi paketlemeniz gerekir. MSIX, önerilen paketleme teknolojimiz olmasına rağmen, dağıtım mekanizmasından bağımsız bir UI Çerçevesi yapmayı hedefliyoruz. Bu, Önizleme 1 bilinen sorunlar belgelerinde görebileceğiniz gibi, sonraki önizlemelerde ele alacağımız geçici bir sınırlamadır .
Ekrandaki metin.

.NET 5'i kucaklamak

WinUI 3 uygulama projesine çift tıklarsanız, Visual Studio proje dosyasını XML metin düzenleyicisiyle açar ve birkaç şeyi gözlemleyebilirsiniz. İlk olarak, C# Desktop WinUI 3 projeleri insan tarafından okunabilir/anlaşılabilir olması için SDK tarzı projeyi benimser İkincisi, Hedef Çerçeve .NET 5'tir. Desktop WinUI 3 , .NET ailesindeki bir sonraki büyük sürümle birlikte kullanılabilir Üçüncüsü, bu projenin WinUI 3 araçlarını ve çalışma zamanını çeken Microsoft.WinUI NuGet paketine bir referansı olduğunu görebilirsiniz.
[kod dili=”xml”]
WinExe
netcoreapp5.0
10.0.18362.0
10.0.17134.0

x86;x64
gerçek
win-x86;win-x64
win-$(Platform)

[/kod]
Araçlardan bahsetmişken, WinUI 3 yeni C#/WinRT projeksiyonlarını kullanır . WinUI 3 çerçevesi bir dizi WinRT bileşenidir ve WinRT, .NET'te bulunanlarla benzer türlere ve nesnelere sahip olsa da, bunlar doğal olarak uyumlu değildir. C#/WinRT projeksiyonları, .NET ve WinRT arasındaki birlikte çalışmayı yöneterek, bugün .NET uygulamanızda WinUI nesnelerini özgürce oluşturmanıza ve kullanmanıza olanak tanır.
WinUI 3 Nuget paket bağımlılık üzerinde C # / WinRT Nuget paketinin winrt.runtime.dll kütüphane ve cswinrt.exe aracı getiriyor. cswinrt.exe aracı, WinRT kitaplıklarını tanımlayan WinMD meta veri dosyalarını kullanır ve birlikte çalışma .NET 5 ve .NET Standard 2.0 C# kodu oluşturur. Bu birlikte çalışma kodu, winrt.runtime.dll kitaplığını kullanır. Tahmin edebileceğiniz gibi, cswinrt.exe tüm WinUI WinMD dosyalarını alır ve WinUI kitaplığı için C# birlikte çalışma kodu .NET 5 kodu oluşturur. Daha sonra bu dosyaları bir .NET kitaplığında derleyebilir (örn. csc.exe derleyicisini kullanarak) ve her .NET 5 Desktop WinUI uygulamasında kullanabilirsiniz. Neyse ki, bu kütüphaneyi zaten sizin için oluşturduk. Bu, Microsoft.WinUI.dll kitaplığıdır. Bu kitaplık, WinUI 3 NuGet Paketine dahildir.
Akış şemasındaki metin.
WinUI NuGet paketi ayrıca Microsoft.Windows.SDK.NET NuGet paketine bağımlıdır. Bu paket, Windows 10 işletim sisteminin bir parçası olarak bulunan WinUI olmayan WinRT API'lerinin kullanımına izin veren Microsoft.Windows.SDK.NET.dll .NET 5 (ve .NET Standard 2.0) birlikte çalışma kitaplığını içerir. Microsoft.WinUI.dll gibi, bu DLL de C#/WinRT tarafından oluşturulur.

Pencere sınıfı ve Win32 API'leri

WinUI 3 Önizleme 1 ile XAML işaretlemesinde Window sınıfının örneklerini oluşturabilirsiniz. MainWindow.xaml dosyasına çift tıklayın ve bunun bir örneğini göreceksiniz:
[kod dili=”xml”]

[/kod]
XAML Pencere sınıfı, masaüstü pencerelerini destekleyecek şekilde genişletildi ve her uygulama modeli tarafından kullanılan düşük seviyeli pencere uygulamasının bir soyutlamasına dönüştürüldü. Örneğin, UWP uygulama modeli CoreWindow'u kullanırken, Win32 uygulama modeli Win32 pencere tanıtıcılarını (HWND) kullanır. Dolayısıyla, bir Masaüstü WinUI uygulaması oluşturuyorsanız, pencere tanıtıcısını alabilir ve onunla Win32 API'lerini kullanabilirsiniz.
Örneğin, klasik User32 ShowWindow API'sini kullanarak Pencereyi programlı olarak büyütelim. Win32 API'lerini User32.dll'den çağırmak için PInvoke.User32 NuGet paketini kullanabilirsiniz . Eğer sonra onu eklendi , MainWindow.xaml.cs kod-geride açmak ve düğme olay işleyicisi şu satırları ekleyin:
[kod lang=”csharp”]
private void myButton_Click(nesne gönderici, RoutedEventArgs e)
{
myButton.Content = “Tıklandı”;

IntPtr hwnd = (App.Current as App).MainWindowWindowHandle;
PInvoke.User32.ShowWindow(hwnd, PInvoke.User32.WindowShowStyle.SW_MAXIMIZE);

}
[/kod]
ShowWindow yöntemi, pencere tanıtıcısını kullanır ve ikinci parametreyi kullanarak ekranı kaplar. Pencere tanıtıcısını almak için, geçerli etkin Pencerenin pencere tanıtıcısını döndüren GetActiveWindow yöntemini kullanabilirsiniz. Örneğin, Pencereyi etkinleştirdikten sonra bu yöntemi çağırabilirsiniz.
MainWindow nesnesi, App.xaml.cs içinde bulabileceğiniz OnLaunched olayında oluşturulur, somutlaştırılır ve etkinleştirilir.
[kod lang=”csharp”]
IntPtr m_windowhandle;
public IntPtr MainWindowWindowHandle { get { return m_windowhandle; } }
korumalı geçersiz kılma void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs argümanları)
{
m_window = new MainWindow();
m_window.Activate();
m_windowhandle = PInvoke.User32.GetActiveWindow();
}

[/kod]
Pencereyi ve odağı göstermek için Etkinleştir'i aramanız gerekir. Kolay değil mi?
Window sınıfında yaptığımız gibi, Application sınıfını da hem UWP hem de Win32 uygulama modellerini destekleyecek şekilde genişlettik. Uygulama nesnesi, çalışma zamanı ortamının Win32 mi yoksa UWP mi olduğunun farkındadır ve uygun uygulama yaşam döngüsü olaylarını tetikler . Örneğin, Resuming olayı Win32'de hiçbir zaman tetiklenmez, ancak UWP'dedir.

Tam güvenilir masaüstü uygulamaları

Daha önce, geliştiricilerin kodlarının herhangi bir AppContainer olmadan güvenlik sanal alanının dışında çalışabilmesini istediğinden bahsetmiştim - buna WinRT jargonunda "tam güven izni" denir - ve Desktop WinUI 3 bunu yapmalarına izin verir. Tüm .NET 5 API'lerini kısıtlama olmaksızın çağırabilirsiniz. Örneğin, mevcut süreci sorgulayabilir ve yüklü modüllerinin bir listesini alabilirsiniz; bu, UWP uygulama modelinde yapamayacağınız bir şeydir. Bakalım ne kadar kolay:
MainWindow.xaml'de bir ContentDialog oluşturun: