Sdílet prostřednictvím


Přehled oken pro WinUI a Windows sadu App SDK

Funkce oken v aplikaci WinUI je poskytována kombinací třídy XAML Window a AppWindow třídy, z nichž obě jsou založeny na modelu HWND Win32.

Aplikace WinUI 3 Gallery obsahuje interaktivní příklady většiny ovládacích prvků, vlastností a funkcionality WinUI 3. Získání aplikace z Microsoft Storu nebo získání zdrojového kódu na GitHubu

XAML Window

V aplikaci je objekt okna instancí třídy Microsoft.UI.Xaml.Window (nebo odvozené třídy), která představuje okno v kódu programu. Vytvoříte ho přímo pomocí volání konstruktoru. XAML Window je místo, kde připojíte obsah aplikace a spravujete životní cyklus oken vaší aplikace.

HWND

Okno aplikace je vytvořeno Windows operačním systémem a je reprezentováno objektem okna Win32. Jedná se o kontejner spravovaný systémem, ve kterém je váš obsah hostovaný, a představuje entitu, se kterou uživatelé pracují, když změní velikost a přesune vaši aplikaci na obrazovce. (Další informace najdete v dokumentaci k Windows Win32.)

Po vytvoření okna aplikace funkce vrátí Windows (window handle), který jednoznačně určuje okno. A window handle má datový typ HWND, i když se zobrazuje v jazyce C# jako IntPtr. Jedná se o neprůhledný popisovač interní Windows datové struktury, která odpovídá oknu, které je nakreslené operačním systémem a využívá systémové prostředky, když je přítomna.

HWND je vytvořen po vytvoření objektu XAML Window, obvykle když je volána metoda Window.Activate.

AppWindow

Sada Windows App SDK poskytuje další funkce pro okna prostřednictvím třídy Microsoft.UI.Windowing.AppWindow AppWindow představuje abstrakci HWND vysoké úrovně. Ve vaší aplikaci je mapování 1:1 mezi AppWindow a HWND nejvyšší úrovně. AppWindow a související třídy poskytují rozhraní API, která umožňují spravovat mnoho aspektů oken nejvyšší úrovně vaší aplikace bez nutnosti přímého přístupu k HWND.

Životnost objektu AppWindow a HWND je stejná – AppWindow je k dispozici ihned po vytvoření okna a je zničena při zavření okna.

Diagram rozhraní API pro okna

Tento diagram znázorňuje vztah mezi třídami a rozhraními API, které používáte ke správě oken v aplikaci a které třídy zodpovídají za každou část správy oken. V některých případech, jako je ExtendsContentIntoTitleBar, je rozhraní API členem AppWindow, aby bylo dostupné pro jiné UI frameworky, ale je také zpřístupněno ve třídě Window pro pohodlí. Diagram není vyčerpávající, ale zobrazuje nejčastěji používaná rozhraní API.

win u i windowing diagram

Poznámka:

Rozhraní API můžete použít AppWindow s libovolným frameworkem uživatelského rozhraní, který podporuje Windows App SDK – Win32, WPF, WinForms nebo WinUI 3. V případě architektur jiných než WinUI 3 by funkce zobrazené v poli XAML Window diagramu byly nahrazeny příslušnými rozhraními API pro okna specifické pro architekturu:

Window/AppWindow Porovnání rozhraní API

Pokud jako architekturu uživatelského rozhraní aplikace používáte WinUI 3 XAML, máte k dispozici jak rozhraní Window, tak AppWindow API. Windows Počínaje sadou App SDK 1.4 můžete pomocí vlastnosti Window.AppWindow získat objekt AppWindow z existujícího okna XAML. S tímto AppWindow objektem máte přístup k dalším rozhraním API pro správu oken.

Důležité

Pokud nepoužíváte WinUI 3 1.3 nebo novější, použijte rozhraní API pro interoperabilitu ke získání AppWindow, abyste mohli využít AppWindow API. Další informace o rozhraních API pro interoperabilitu najdete v tématu Správa oken aplikací - infrastruktura uživatelského rozhraní a interoperabilita HWND a v ukázce galerie oken .

Správa doby života

XAML Window AppWindow
Constructor Create, GetFromWindowId
Activate Zobrazit, skrýt
Zavřít, uzavřeno Zničit, Ničení, Uzavření
>>> ID, OwnerWindowId

Když v sadě Visual Studio vytvoříte nový projekt WinUI, šablona projektu vám poskytne třídu MainWindow, která je podtřídou Window. Pokud vaše aplikace potřebuje jenom jedno okno, stačí to všechno, co potřebujete. Pokud chcete zjistit, jak vytvořit a spravovat další okna a proč byste mohli chtít, přečtěte si článek Zobrazení více oken pro vaši aplikaci.

Třída AppWindow má rozhraní API k vytvoření a zničení nového okna. V případě aplikace WinUI to ale nebudete dělat v praxi, protože k vytvořenému okně není k dispozici žádné rozhraní API pro připojení obsahu. Místo toho získáte instanci AppWindow vytvořené systémem a přidruženou k XAML Window a HWND. Ve WinUI 1.4 a novějším můžete pomocí Windowvlastnosti .AppWindow získat instanci AppWindow. V jiných případech můžete použít statickou metodu AppWindow.GetFromWindowId k získání AppWindow instance. Další informace najdete v tématu Správa oken aplikací .

Content

XAML Window AppWindow
Content N/A

Vlastnost Window.Content je místo, kde připojíte obsah své aplikace k oknu, které ho zobrazí. Můžete to udělat v xaml nebo v kódu.

Nadpis, ikona a záhlaví

XAML Window AppWindow
Titul Titul
SetTitleBar TitleBar
>>> SetIcon, SetTaskbarIcon, SetTitleBarIcon
ExtendsContentIntoTitleBar AppWindow. TitleBar.ExtendsContentIntoTitleBar

Záhlaví aplikace můžete upravit podle různých stupňů; nastavení názvu a ikony, změny barev nebo úplné nahrazení záhlaví vlastním obsahem aplikace

Informace o používání rozhraní API záhlaví, včetně příkladů kódu, najdete v tématu Přizpůsobení záhlaví.

Velikost a umístění

XAML Window AppWindow
Hranice Pozice, velikost, velikost klienta
SizeChanged Změněno (DidPositionChange, DidSizeChange)
>>> Přesunutí, změna velikosti, ResizeClient, MoveAndResize
>>> MoveInZOrderAtBottom, MoveInZOrderAtTop, MoveInZOrderBelow

Použijete .Window vlastnost Bounds a událost SizeChanged pro správu prvků v uživatelském rozhraní aplikace, jako je přesouvání entit při změně velikosti okna. XAML používá effective pixels (epx), nikoli skutečné fyzické pixely. Effective pixels jsou virtuální měrnou jednotkou a používají se k vyjádření rozměrů rozložení a mezer nezávisle na hustotě obrazovky.

AppWindow, na druhé straně používá souřadnicovýWindow systém, kde základní měrná jednotka je fyzické zařízení pixely. Prostřednictvím rozhraní AppWindow API používáte k akcím souvisejícím s oknem, jako je změna velikosti okna nebo jeho přesunutí ve vztahu k jiným objektům na obrazovce.

V některých případech budete potřebovat použít měření z jedné třídy ve druhé třídě, v takovém případě budete muset převést mezi effective pixels a pixely zařízení. Například pokud nastavíte oblasti pro přetahování ve vlastním záhlaví, budete muset převést měření. Příklad použití XamlRoot.RasterizationScale k převodu měření najdete v části interaktivního obsahu článku přizpůsobení záhlaví .

Vzhled a chování

XAML Window AppWindow
SystemBackdrop N/A
>>> Prezentující, SetPresenter
>>> IsShownInSwitchers
Viditelné, ViditelnostZměněna IsVisible, Changed (DidVisibilityChange)
DispatcherQueue DispatcherQueue, AssociateWithDispatcherQueue
Compositor N/A

Rozhraní API XAML Window jsou obecně zodpovědná za vzhled obsahu vaší aplikace, jako je pozadí. Další informace o SystemBackdrop naleznete v tématu Použití Mica nebo Akrylových materiálů.

AppWindow API jsou zodpovědné za neklientskou část okna a za interakci vaší aplikace s operačním systémem .

Poznámka:

Třída XAML Window má několik vlastností, které byly přeneseny z UPW Windows. UI. Xaml.Window třída, ale nejsou podporovány v aplikacích WinUI. Tyto vlastnosti mají null vždy hodnotu a nejsou používány v aplikacích WinUI: CoreWindow, Currenta Dispatcher.

Sledování aktuálního okna

I když vlastnost Current není v aplikacích WinUI podporovaná, možná budete potřebovat přistupovat k rozhraním API Window z jiných míst ve vaší aplikaci. Můžete například potřebovat získat hranice nebo zpracovat událost .SizeChanged z kódu pro stránku . V tomto případě můžete poskytnout přístup k Window vlastnosti podobným způsobem jako Current vlastnost pomocí veřejné statické vlastnosti ve vaší App třídě.

Uděláte to tak, že upravíte Window deklaraci ve třídě aplikace, jak je znázorněno zde.

// App.xaml.cs in a WinUI app
public partial class App : Application
{
    ...
    public static Window Window { get { return m_window; } }
    private static Window m_window;
}
// App.xaml.h in a WinUI app
...
struct App : AppT<App>
{
    ...
    static winrt::Microsoft::UI::Xaml::Window Window(){ return window; };

private:
    static winrt::Microsoft::UI::Xaml::Window window;
};
...

// App.xaml.cpp
...
winrt::Microsoft::UI::Xaml::Window App::window{ nullptr };
...

Potom, abyste přistoupili k Window z jiných míst ve vaší aplikaci, použijte App.Window takto:

// MainPage.xaml.cs in a WinUI app
var width = App.Window.Bounds.Width;
// MainPage.xaml.cpp in a WinUI app
#include <App.xaml.h>
auto width{ App::Window().Bounds().Width };

Důležité

Použití statické Window vlastnosti ve třídě App je užitečné, pokud vaše aplikace používá jenom jedno okno. Pokud vaše aplikace používá více oken, měli byste místo toho použít WindowId ke sledování Window instancí, abyste měli jistotu, že přistupujete ke správné instanci Window. Další informace a příklady najdete v tématu Zobrazení více oken pro vaši aplikaci .