Estou escrevendo uma caixa de diálogo modal no WPF. Como faço para definir uma janela WPF para não ter um botão Fechar? Eu ainda gostaria por suaWindowState
que tivesse uma barra de título normal.
Eu encontrei ResizeMode
, WindowState
e WindowStyle
, mas nenhuma dessas propriedades permitir-me a esconder o botão de fechar, mas mostrar a barra de título, como em diálogos modais.
Respostas:
O WPF não possui uma propriedade interna para ocultar o botão Fechar da barra de título, mas você pode fazer isso com algumas linhas de P / Invoke.
Primeiro, adicione estas declarações à sua classe Window:
Em seguida, coloque este código no
Loaded
evento da janela :E pronto: não há mais botão Fechar. Você também não terá um ícone de janela no lado esquerdo da barra de título, o que significa que não há menu do sistema, mesmo quando você clica com o botão direito do mouse na barra de título - todos eles caminham juntos.
Observe que Alt+ F4ainda fechará a janela. Se você não quiser permitir que a janela seja fechada antes que o encadeamento em segundo plano seja concluído, você também poderá substituir
OnClosing
e definirCancel
como true, como sugeriu Gabe.fonte
SetWindowLongPtr
.Acabei de chegar a um problema semelhante e a solução de Joe White me parece simples e limpa. Eu o reutilizei e o defini como uma propriedade anexada do Window
Então, no XAML, você apenas o define assim:
fonte
Defina a
WindowStyle
propriedade como None, que ocultará a caixa de controle junto com a barra de título. Não há necessidade de chamadas kernais.fonte
this.DragMove();
à janelaMouseDown
eventoIsso não se livra do botão Fechar, mas impede que alguém feche a janela.
Coloque isso no seu código por trás do arquivo:
fonte
Window
configurada como um diálogo modal interferirá naWindow
configuração de suaDialogResult
propriedade e poderá torná-lo inutilizável. stackoverflow.com/questions/898708/cant-set-dialogresult-in-wpfPara desativar o botão Fechar, você deve adicionar o seguinte código à sua classe Window (o código foi retirado daqui , editado e reformatado um pouco):
Esse código também desativa o item de fechamento no menu Sistema e não permite fechar a caixa de diálogo usando Alt + F4.
Você provavelmente desejará fechar a janela programaticamente. Apenas ligar
Close()
não funcionará. Faça algo parecido com isto:fonte
Eu estava tentando a resposta de Viachaslau, já que gosto da idéia de não remover o botão, mas desativá-lo, mas por algum motivo nem sempre funcionava: o botão Fechar ainda estava ativado, mas sem erros.
Por outro lado, isso sempre funcionou (verificação de erro omitida):
fonte
Window
método de extensão no meu projeto.A propriedade a ser configurada é =>
WindowStyle="None"
fonte
Acabei de adicionar minha implementação da resposta de Joe White usando o Interactivity Behavior (você precisa fazer referência ao System.Windows.Interactivity).
código:
uso:
fonte
Deixe o usuário "fechar" a janela, mas realmente apenas a oculte.
No evento OnClosing da janela, oculte a janela se já estiver visível:
Cada vez que o encadeamento em segundo plano for executado, mostre novamente a janela da interface do usuário em segundo plano:
Ao encerrar a execução do programa, verifique se todas as janelas estão / podem ser fechadas:
fonte
Então, aqui está o seu problema. O botão Fechar no canto superior direito de um quadro de janela não faz parte da janela WPF, mas pertence à parte do quadro de janela que é controlada pelo seu sistema operacional. Isso significa que você precisará usar a interoperabilidade do Win32 para fazer isso.
alternativamente, você pode usar o noframe e fornecer seu próprio "quadro" ou não ter nenhum quadro.
fonte
A seguir, é sobre como desativar os botões Fechar e Maximizar / Minimizar, não removem os botões (mas removem os itens de menu!). Os botões na barra de título são desenhados no estado desativado / acinzentado. (Não estou pronto para assumir todas as funcionalidades ^ ^)
Isso é um pouco diferente da solução Virgoss, pois remove os itens de menu (e o separador à direita, se necessário), em vez de apenas desativá-los. Difere da solução de Joe Whites, pois não desativa todo o menu do sistema e, portanto, no meu caso, posso manter o botão e o ícone Minimizar.
O código de acompanhamento também suporta a desativação do Maximizar / Minimizar botões como, ao contrário do botão Fechar, removendo as entradas do menu não causar o sistema para tornar os botões de "deficiente", apesar de remover as entradas do menu faz desactivar a funcionalidade dos botões.
Funciona para mim. YMMV.
Uso: Isso deve ser feito APÓS a fonte ser inicializada. Um bom lugar é usar o evento SourceInitialized da janela:
Para desabilitar a funcionalidade Alt + F4, o método fácil é apenas conectar o evento Canceling e usar um sinalizador para quando você realmente deseja fechar a janela.
fonte
Código XAML
Deveria trabalhar
Editar - por um instante, este Tópico mostra como isso pode ser feito, mas não creio que o Windows tenha uma propriedade para obter o que deseja sem perder a barra de título normal.
Editar 2 Este tópico mostra uma maneira de fazer isso, mas você deve aplicar seu próprio estilo ao menu do sistema e mostra como você pode fazer isso.
fonte
Tente adicionar um evento de fechamento à janela. Adicione esse código ao manipulador de eventos.
Isso impedirá que a janela se feche. Isso tem o mesmo efeito que ocultar o botão Fechar.
fonte
Use isso, modificado em https://stephenhaunts.com/2014/09/25/remove-the-close-button-from-a-wpf-window :
fonte
Isso não oculta o botão, mas impede o usuário de avançar fechando a janela.
fonte
Ir para o conjunto de propriedades da janela
você não consegue fechar botões ...
fonte
WindowStyle = "None"
observe sua sintaxe. Por outro lado, é uma abordagem de espingarda que também remove a barra de título, tornando a caixa feia e sem título, quando há muitas maneiras muito melhores de lidar com isso (como evidenciado pelas outras respostas) e é uma resposta duplicada.Conforme indicado em outras respostas, você pode usar
WindowStyle="None"
para remover completamente a barra de título.E, conforme declarado nos comentários dessas outras respostas, isso evita que a janela seja arrastável, tornando difícil movê-la de sua posição inicial.
No entanto, você pode superar isso adicionando uma única linha de código ao Construtor no arquivo Code Behind da janela:
Ou, se você preferir a sintaxe Lambda:
Isso torna toda a janela arrastável. Quaisquer controles interativos presentes na janela, como botões, ainda funcionarão normalmente e não funcionarão como alças de arrasto para a janela.
fonte
Depois de muito procurar a resposta, resolvi esta solução simples que vou compartilhar aqui, na esperança de ajudar outras pessoas.
Eu ajustei
WindowStyle=0x10000000
.Isso define os valores
WS_VISIBLE (0x10000000)
eWS_OVERLAPPED (0x0)
para o estilo da janela. "Sobreposto" é o valor necessário para mostrar a barra de título e a borda da janela. Removendo oWS_MINIMIZEBOX (0x20000)
,WS_MAXIMIZEBOX (0x10000)
, eWS_SYSMENU (0x80000)
os valores do meu valor estilo, todos os botões da barra de título foram removidos, incluindo o botão Fechar.fonte
WindowStyle
há uma enumeração cujos valores não correspondem às constantes da API do Windows; coagir o valor àWindowStyle
enumeração não funcionará. Para ter certeza, verifiquei o código-fonte .NET no ILSpy; o valor da enumeração é convertido para a API do Windows na função privadaCreateWindowStyle
e, se a função encontrar umWindowStyle
valor desconhecido , ela simplesmente será aplicadaWindowStyle.None
. (A única maneira seria usar as propriedades internas_Style
e_StyleEx
usando a reflexão, o que eu recomendo fortemente contra.)Use
WindowStyle="SingleBorderWindow"
, isso ocultará o botão max e min da janela WPF.fonte
close
botãoSe a necessidade é apenas proibir o usuário de fechar a janela, esta é uma solução simples.
Código XAML:
IsCloseButtonEnabled="False"
fonte