Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A WinUI 3 alkalmazásban megjelenítheti az alkalmazás tartalmát a másodlagos ablakokban, miközben továbbra is ugyanazon a felhasználói felületen dolgozik az egyes ablakokon.
- Fontos API-k: Microsoft.UI.Windowing névtér, Window osztály, AppWindow osztály
![]()
A WinUI 3 Katalógus alkalmazás interaktív példákat tartalmaz a WinUI vezérlőire és funkcióira. Kérje le az alkalmazást a Microsoft Áruházból vagy keresse meg a forráskódot a GitHub webhelyen.
Jótanács
A több ablak használatának gyakori oka, hogy lehetővé teszi a TabView-lapok új ablakba való kibontását. Az erre a forgatókönyvre vonatkozó információkért és példákért lásd a Tab nézet cikkének Tab-kibontás című szakaszát.
AZ API áttekintése
Az alábbiakban néhány fontos API-t használ a tartalom több ablakban való megjelenítéséhez.
XAML Window és AppWindow
Window Az AppWindow osztályokkal egy alkalmazás egy részét megjelenítheti egy másodlagos ablakban. A WinUI-ablakok fontos funkciója, hogy minden példány ugyanazt a felhasználói felületi feldolgozási szálat használja (beleértve az eseményszolgáltatót is), amelyből létrehozták őket, ami leegyszerűsíti a többablakos alkalmazásokat.
A WinUI és Windows App SDK Windowing áttekintésében részletesebb ismertetést talál a Window és AppWindow elemekről.
AppWindowPresenter
Az AppWindowPresenter API segítségével egyszerűen válthat az ablakok előre definiált konfigurációkra, például FullScreen vagy CompactOverlay. További információért lásd: Alkalmazásablakok kezelése.
XamlRoot
Az XamlRoot osztály egy XAML elemfát tartalmaz, csatlakoztatja az ablakgazdaobjektumhoz, és olyan információkat biztosít, mint a méret és a láthatóság. Nem hozhat létre közvetlenül XamlRoot objektumot. Ehelyett létrejön egy, amikor egy XAML-elemet csatol egy Window-hez. Ezután a UIElement.XamlRoot tulajdonság használatával lekérheti a XamlRoot tulajdonságot.
WindowId
WindowId egy alkalmazásablak egyedi azonosítója. Automatikusan létrejön, és azonosítja mind a AppWindow, mind a hozzá kapcsolódó legfelső szintű Win32 HWND-t.
Egy vizuális elemből elérhető a UIElement.XamlRoot, majd a XamlRoot.ContentIslandEnvironment, és végül a ContentIslandEnvironment.AppWindowId tulajdonság tartalmazza annak az ablaknak az azonosítóját, amelyben az UIElement található.
Új ablak megjelenítése
Létrehozhat egy újat Window az XAML-ben vagy kódban. Ha XAML-ben hoz létre egy Window alosztályt, valójában az Window osztály egy alosztályát hozza létre. Lásd például a Visual Studio alkalmazássablon által létrehozott MainWindow.xaml.
Vessünk egy pillantást a tartalom új ablakban való megjelenítésének lépéseire.
Új ablak létrehozása az XAML használatával
- A Solution Explorer panelen kattintson a jobb gombbal a projekt nevére, és válassza a Add > New Item...
- Az Új elem hozzáadása párbeszédpanelen válassza a WinUI lehetőséget az ablak bal oldalán található sablonlistában.
- Válassza az Üres Window sablont.
- A fájl neve legyen .
- Nyomja le a Hozzáadás billentyűt.
Új ablak megjelenítése
Új példányt hozhat létre a Window-ból, vagy egy Window alosztályból, amennyiben egy fájllal egy Window alosztályt hozott létre
.xaml.Window newWindow = new Window();Hozza létre az ablak tartalmát.
Ha egy Window alosztályt hozott létre egy
.xamlfájl segítségével, akkor az ablak tartalmát közvetlenül az XAML-ben is hozzáadhatja. Ellenkező esetben az itt látható módon adja hozzá a tartalmat a kódhoz.Gyakori, hogy létrehoz egy XAML-t Frame, majd navigál egy Frame XAML [Page](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.page) oldalra, ahol definiálta az alkalmazás tartalmát. A képkockákkal és a lapokkal kapcsolatos további információkért lásd a két oldal közötti közvetlen navigációt pontban.
Frame contentFrame = new Frame(); contentFrame.Navigate(typeof(SecondaryPage));Azonban a AppWindow bármilyen XAML-tartalmat megjeleníthet, nem csak egy Frame és Page. Például csak egyetlen vezérlőt jeleníthet meg, például a ColorPickert, ahogy az később is látható.
Állítsa be az XAML-tartalmat a Content tulajdonságára a Window.
newWindow.Content = contentFrame;Hívja meg az Window.Activate metódust az új ablak megjelenítéséhez.
newWindow.Activate();
Példányok nyomon követése Window
Előfordulhat, hogy hozzáférést szeretne az alkalmazás más részeiből származó Window példányokhoz, de miután létrehozta a Window példányát, nem tud hozzáférni más kódból, hacsak nem tart fenn rá hivatkozást. Előfordulhat például, hogy kezelni szeretné a Window.SizeChanged esemény kezelését MainPage a felhasználói felület elemeinek átrendezéséhez, amikor az ablak átméretezésére kerül sor, vagy lehet egy "Összes bezárása" gomb, amely bezárja az összes nyomon követett példányt Window.
Ebben az esetben az WindowId egyedi azonosítót kell használnia az ablakpéldányok nyomon követéséhez egy Dictionary-ben, a WindowId mint Key és a Window példány mint Value. (TabView lapkitépési API-k a WindowId használatával is nyomon követik az ablakokat.)
Az Ön App osztályában hozza létre a Dictionary statikus tulajdonságként. Ezután, amikor létrehoz egy lapot, adja hozzá a Dictionary-hoz, és amikor a lap bezárásra kerül, távolítsa el onnan.
// 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);
}
}
Az alábbi kód új ablakot hoz létre, amikor egy gombra kattint.MainPage A TrackWindow metódus hozzáadja az új ablakot a ActiveWindowsDictionary-hoz, és kezeli a Window.Closed eseményt, hogy eltávolítsa azt a ActiveWindows-ből, amikor az ablak bezárul.
// 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);
}
Nyomon követett ablak lekérése az alkalmazáskódból
Ha az alkalmazás kódjából szeretne elérni egy Window példányt, le kell kérnie az aktuális ablak WindowId-ját, hogy lekérje azt a Dictionary osztály statikus App eleméből. Ezt a lap Betöltött eseménykezelőjében kell elvégeznie, nem pedig a konstruktorban, hogy az XamlRoot ne nulllegyen.
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];
}
}
}
Kapcsolódó témakörök
Windows developer