Ao criar aplicações WPF com interface personalizada, é comum precisar substituir os controles padrão de janela por botões customizados para fechar, minimizar e maximizar. Além disso, eliminar a moldura nativa e aplicar cantos arredondados proporciona um visual moderno e elegante.
Implementação de Controles de Janela
A seguir, apresentamos uma abordagem para manipular os estados da janela através de métodos dedicados:
private void EncerrarAplicativo()
{
var confirmacao = MessageBox.Show(
"Deseja realmente sair do programa?",
"Confirmação de Saída",
MessageBoxButton.YesNo,
MessageBoxImage.Question);
if (confirmacao == MessageBoxResult.Yes)
{
System.Environment.Exit(0);
}
}
private void AlternarMaximizacao()
{
var janela = Application.Current.MainWindow;
if (janela.WindowState == WindowState.Normal)
{
janela.MaxHeight = SystemParameters.WorkArea.Height;
janela.WindowStyle = WindowStyle.None;
janela.ResizeMode = ResizeMode.NoResize;
janela.WindowState = WindowState.Maximized;
}
else if (janela.WindowState == WindowState.Maximized)
{
janela.ResizeMode = ResizeMode.CanResize;
janela.WindowState = WindowState.Normal;
}
}
private void MinimizarJanela()
{
Application.Current.MainWindow.WindowState = WindowState.Minimized;
}
Arrastar a Janela pela Área Completa
Para permitir que o usuário mova a janela clicando em qualquer região da superfície, utilize o evento de pressionamento do botão eqsuerdo do mouse:
private void AoPressionarBotaoMouse(object sender, MouseButtonEventArgs e)
{
this.DragMove();
}
Modos de Redimensionamento da Janela
A propriedade ResizeMode controla o comportamento de redimensionamento da janela:
- NoResize — Janela com tamanho fixo. Exibe apenas o botão de minimizar e fechar.
- CanMinimize — Janela com tamanho fixo, porém permite minimizar. Não exibe botão de maximizar.
- CanResize — Comportamento padrão. Permite redimensionamento livre com todos os botões disponíveis.
- CanResizeWithGrip — Similar ao anterior, mas adiciona um indicador visual no canto inferior direito para redimensionamento.
Controles via ViewModel (Padrão MVVM)
Em aplicações que seguem o padrão MVVM, os comandos de controle da janela podem ser implementados diretamente na ViewModel:
private void FecharJanela()
{
System.Environment.Exit(0);
}
private void TrocarEstadoJanela()
{
var janelaPrincipal = Application.Current.MainWindow;
if (janelaPrincipal.WindowState == WindowState.Normal)
janelaPrincipal.WindowState = WindowState.Maximized;
else
janelaPrincipal.WindowState = WindowState.Normal;
}
private void ReduzirJanela()
{
Application.Current.MainWindow.WindowState = WindowState.Minimized;
}
Criando Janela sem Borda com Cantos Arredondados
Removendo a Moldura Padrão
As propriedades essenciais para eliminar a borda nativa da janela são:
Background="Transparent"
WindowStyle="None"
AllowsTransparency="True"
Aplicando Cantos Arredondados
Utilize um Border como elemento raiz do conteúdo da janela para definir o raio dos cantos:
<Border CornerRadius="12" BorderThickness="0" BorderBrush="Transparent">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="#FF2C3E50" Offset="0"/>
<GradientStop Color="#FF4CA1AF" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
<Grid>
<!-- Conteúdo da aplicação aqui -->
</Grid>
</Border>
Configurando o WindowChrome
O WindowChrome permite personalizar a aparência da janela mantendo funcionalidades nativas do sistema operacional:
<WindowChrome.WindowChrome>
<WindowChrome
ResizeBorderThickness="5"
CaptionHeight="0"
CornerRadius="0"
GlassFrameThickness="0"/>
</WindowChrome.WindowChrome>
Parâmetros do WindowChrome:
ResizeBorderThickness— Define a espessura invisível da borda usada para redimensionamento.CaptionHeight— Altura da área de título. Defina como 0 para controle total via XAML.CornerRadius— Raio dos cantos da janela.GlassFrameThickness— Espessura da borda visível do efeito glass.