Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Em seu aplicativo WinUI 3, você pode mostrar o conteúdo do aplicativo em janelas secundárias enquanto ainda trabalha no mesmo thread de UI em todas as janelas.
- APIs importantes: namespace Microsoft.UI.Windowing, Window classe, AppWindow classe
O aplicativo Galeria da WinUI 3 inclui exemplos interativos da maioria dos controles, recursos e funcionalidades da WinUI 3. Obtenha o aplicativo na Microsoft Store ou obtenha o código-fonte no GitHub
Dica
Um motivo comum para usar várias janelas é permitir que as guias TabView sejam divididas em uma nova janela. Para obter informações e exemplos específicos para esse cenário, consulte Tab tear-out no artigo tab view .
Visão geral da API
Aqui estão algumas das APIs importantes que você usa para mostrar conteúdo em várias janelas.
XAML Window e AppWindow
O Window e AppWindow as classes podem ser usados para exibir uma parte de um aplicativo em uma janela secundária. Um recurso importante de janelas WinUI é que cada instância compartilha o mesmo thread de processamento da interface do usuário (incluindo o dispatcher de eventos) do qual foram criadas, o que simplifica os aplicativos de várias janelas.
Consulte Visão geral de janelas do WinUI e do SDK de Aplicativos do Windows para obter uma explicação mais detalhada de Window e AppWindow.
AppWindowPresenter
A API AppWindowPresenter permite alternar facilmente janelas para configurações predefinidas como FullScreen ou CompactOverlay. Para obter mais informações, consulte Gerenciar janelas do aplicativo.
XamlRoot
A classe XamlRoot contém uma árvore de elementos XAML, conecta-a ao objeto host da janela e fornece informações como tamanho e visibilidade. Você não cria um objeto XamlRoot diretamente. Em vez disso, um é criado quando você anexa um elemento XAML a um Window. Em seguida, você pode usar a propriedade UIElement.XamlRoot para recuperar o XamlRoot.
WindowId
WindowId é um identificador exclusivo para uma janela do aplicativo. Ele é criado automaticamente e identifica tanto o AppWindow quanto o HWND Win32 de nível superior ao qual está associado.
Em um elemento visual, você pode acessar UIElement.XamlRoot; em seguida , XamlRoot.ContentIslandEnvironment; em seguida, a propriedade ContentIslandEnvironment.AppWindowId contém a ID da janela em que o UIElement está.
Mostrar uma nova janela
Você pode criar um novo Window em XAML ou em código. Se você criar um Window em XAML, você está realmente criando uma sub-classe da Window classe. Por exemplo, veja MainWindow.xaml que foi criado pelo modelo de aplicativo do Visual Studio.
Vamos dar uma olhada nas etapas para mostrar o conteúdo em uma nova janela.
Para criar uma nova janela com XAML
- No painel Gerenciador de Soluções , clique com o botão direito do mouse no nome do projeto e selecione Adicionar > Novo Item...
- Na caixa de diálogo Adicionar Novo Item , selecione WinUI na lista de modelos no lado esquerdo da janela.
- Selecione o modelo em branco Window .
- Dê um nome ao arquivo.
- Pressione Adicionar.
Mostrar uma nova janela
Instancie uma nova instância de Window ou de uma subclasse Window se você criou uma subclasse Window com um arquivo
.xaml.Window newWindow = new Window();Crie o conteúdo da janela.
Se você criou uma Window subclasse com um
.xamlarquivo, poderá adicionar o conteúdo da janela diretamente no XAML. Caso contrário, você adicionará o conteúdo no código, conforme mostrado aqui.É comum criar um XAML Framee, em seguida, navegar Frame até um XAML [Page](/windows/windows-app-sdk/api/winrt/microsoft.ui.xaml.controls.page em que você definiu o conteúdo do aplicativo. Para obter mais informações sobre quadros e páginas, confira Navegação ponto a ponto entre duas páginas.
Frame contentFrame = new Frame(); contentFrame.Navigate(typeof(SecondaryPage));No entanto, você pode mostrar qualquer conteúdo XAML no AppWindow, não apenas um Frame e Page. Por exemplo, você pode mostrar apenas um único controle, como ColorPicker, conforme mostrado posteriormente.
Defina o conteúdo XAML como a propriedade Content do Window.
newWindow.Content = contentFrame;Chame o método Window.Activate para mostrar a nova janela.
newWindow.Activate();
Acompanhar instâncias de Window
Talvez seja necessário ter acesso às Window instâncias de outras partes do aplicativo, mas, após criar uma instância de Window, não é possível acessá-la a partir de outro código, a menos que se mantenha uma referência a ela. Por exemplo, talvez você queira lidar com o evento Window.SizeChanged em MainPage para reorganizar elementos da interface do usuário quando a janela for redimensionada, ou você pode ter um botão "fechar tudo" que fecha todas as instâncias rastreadas de Window.
Nesse caso, você deve usar o WindowId identificador exclusivo para monitorar as instâncias de janela em um Dictionary, com a WindowId como Key, e a instância de Window como Value. (As APIs de tear-out da guia TabView também são usadas WindowId para rastrear o Windows.)
Em sua App classe, crie a Dictionary como uma propriedade estática. Em seguida, adicione cada página a Dictionary ao criá-la e remova-a quando a página for fechada.
// 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);
}
}
O código a seguir cria uma nova janela quando um botão é clicado em MainPage. O
// 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);
}
Obter uma janela monitorada do código do aplicativo
Para acessar uma instância de Window do código do aplicativo, você precisa obter o WindowId da janela atual para recuperá-la do Dictionary estático na classe App. Você deve fazer isso no manipulador de eventos Loaded da página em vez de no construtor para que XamlRoot não nullseja .
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];
}
}
}
Tópicos relacionados
Windows developer