Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V aplikaci WinUI 3 můžete obsah aplikace zobrazit v sekundárních oknech a současně pracovat na stejném vlákně uživatelského rozhraní v každém okně.
- Důležitá rozhraní API: Microsoft.UI.Windowing namespace, Window třída, AppWindow třída
![]()
Aplikace Galerie WinUI 3 obsahuje interaktivní příklady ovládacích prvků a funkcí WinUI. Získejte aplikaci z Microsoft Store nebo vyhledejte zdrojový kód na GitHub.
Návod
Běžným důvodem pro použití více oken je umožnit, aby se karty TabView odtrhly do nového okna. Informace a příklady specifické pro tento scénář najdete v článku o odtrhnutí záložky v zobrazení záložek.
Přehled rozhraní API
Tady jsou některá důležitá rozhraní API, která používáte k zobrazení obsahu ve více oknech.
XAML Window a AppWindow
Třídy Window a AppWindow lze použít k zobrazení části aplikace ve vedlejším okně. Důležitou funkcí oken WinUI je, že každá instance sdílí stejné vlákno zpracování uživatelského rozhraní (včetně dispečeru událostí), ze kterého byly vytvořeny, což zjednodušuje aplikace s více okny.
Podrobnější vysvětlení Window a AppWindow najdete v tématu přehled oknování pro WinUI a Windows App SDK.
AppWindowPresenter
Rozhraní API AppWindowPresenter umožňuje snadno přepínat okna do předdefinovaných konfigurací, jako je FullScreen nebo CompactOverlay. Další informace najdete v tématu Správa oken aplikací.
XamlRoot
Třída XamlRoot obsahuje strom elementů XAML, připojí ho k objektu hostitele okna a poskytuje informace, jako je velikost a viditelnost. Objekt XamlRoot nevytvoříte přímo. Místo toho se vytvoří při připojení elementu XAML k objektu Window. Pak můžete použít UIElement.XamlRoot vlastnost načíst XamlRoot.
WindowId
WindowId je jedinečný identifikátor okna aplikace. Vytvoří se automaticky a identifikuje jak AppWindow, tak i nejvyšší úrovni HWND pro Win32, se kterou je spojen.
Z vizuálního prvku můžete přistupovat k UIElement.XamlRoot; potom k XamlRoot.ContentIslandEnvironment; pak vlastnost ContentIslandEnvironment.AppWindowId obsahuje ID okna, ve kterém je UIElement.
Zobrazit nové okno
Můžete vytvořit nový Window v XAML nebo v kódu. Pokud vytvoříte Window v JAZYCE XAML, ve skutečnosti vytváříte podtřídu Window třídy. Podívejte se například na MainWindow.xaml vytvořené šablonou aplikace Visual Studio.
Pojďme se podívat na postup, jak zobrazit obsah v novém okně.
Vytvoření nového okna pomocí XAML
- V podokně Solution Explorer klikněte pravým tlačítkem myši na název projektu a vyberte Přidat > Nová položka...
- V dialogovém okně Přidat novou položku vyberte WinUI v seznamu šablon na levé straně okna.
- Vyberte prázdnou Window šablonu.
- Pojmenujte soubor .
- Stiskněte Přidat.
Zobrazení nového okna
Vytvořte novou instanci Window, nebo podtřídu Window, pokud jste vytvořili podtřídu Window se souborem
.xaml.Window newWindow = new Window();Vytvořte obsah okna.
Pokud jste vytvořili podtřídu Window se souborem
.xaml, můžete obsah okna přidat přímo v XAML. V opačném případě přidáte obsah v kódu, jak je znázorněno zde.Je běžné vytvořit XAML Framea pak přejít Frame na XAML [Page](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.page, kde jste definovali obsah aplikace. Více informací o rámcích a stránkách viz téma Peer-to-peer navigace mezi dvěma stránkami.
Frame contentFrame = new Frame(); contentFrame.Navigate(typeof(SecondaryPage));Můžete ale zobrazit jakýkoli obsah XAML v souboru AppWindow, nejen Frame a Page. Můžete například zobrazit jenom jeden ovládací prvek, například ColorPicker, jak je znázorněno později.
Nastavte obsah XAML na vlastnost Content objektu Window.
newWindow.Content = contentFrame;Zavolejte Window.Activate metodu pro zobrazení nového okna.
newWindow.Activate();
Sledujte instance Window
Možná budete chtít mít přístup k instancím Window z jiných částí vaší aplikace, ale po vytvoření instance Window neexistuje způsob, jak k ní přistupovat z jiného kódu, pokud si na ni neudržíte odkaz. Můžete například chtít zpracovat událost Window.SizeChanged pro změnu uspořádání prvků uživatelského rozhraní při změně velikosti okna nebo můžete mít tlačítko "Zavřít vše", které zavře všechny sledované instance MainPage.
V tomto případě byste měli použít WindowId jedinečný identifikátor ke sledování instancí okna v objektu Dictionary, s WindowId jako Key a instancí Window jako Value. (TabView API pro odtržení záložek také používají WindowId k sledování systému Windows.)
Ve třídě App vytvořte Dictionary jako statickou vlastnost. Potom při vytváření přidejte každou stránku do Dictionary a po zavření stránky ji odeberte.
// App.xaml.cs
public partial class App : Application
{
private Window? _window;
public static Dictionary<WindowId, Window> ActiveWindows { get; set; } = new Dictionary<WindowId, Window>();
// ...
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
_window = new MainWindow();
_window.Activate();
// Track the new window in the dictionary.
ActiveWindows.Add(_window.AppWindow.Id, _window);
}
}
Následující kód vytvoří nové okno při kliknutí na MainPagetlačítko . Metoda TrackWindow přidá nové okno do ActiveWindowsDictionary a zpracovává událost Window.Closed, aby ho odebrala z ActiveWindows při zavření okna.
// MainPage.xaml.cs
private Window CreateWindow()
{
Window newWindow = new Window();
// Configure the window.
newWindow.AppWindow.Resize(new SizeInt32(1200, 800));
newWindow.Title = "Window " + newWindow.AppWindow.Id.Value.ToString();
newWindow.SystemBackdrop = new MicaBackdrop();
TrackWindow(newWindow);
return newWindow;
}
private void TrackWindow(Window window)
{
window.Closed += (sender, args) => {
App.ActiveWindows.Remove(window.AppWindow.Id, out window);
};
App.ActiveWindows.Add(window.AppWindow.Id, window);
}
Získejte sledované okno z kódu vaší aplikace
Pokud chcete získat přístup k Window instanci z kódu aplikace, musíte získat WindowId pro aktuální okno, abyste ho mohli načíst ze statického Dictionary objektu ve třídě App. Měli byste to provést v obslužné metodě události Loaded stránky místo v konstruktoru, aby XamlRoot nebyl null.
public sealed partial class SecondaryPage : Page
{
Window window;
public SecondaryPage()
{
InitializeComponent();
Loaded += AppWindowPage_Loaded;
}
private void AppWindowPage_Loaded(object sender, RoutedEventArgs e)
{
// Get the reference to this Window that was stored when it was created.
// Do this in the Page Loaded handler rather than the constructor to
// ensure that the XamlRoot is created and attached to the Window.
WindowId windowId = this.XamlRoot.ContentIslandEnvironment.AppWindowId;
if (App.ActiveWindows.ContainsKey(windowId))
{
window = App.ActiveWindows[windowId];
}
}
}
Související témata
Windows developer