Basicamente, quando o usuário redimensiona a janela do meu aplicativo, eu quero que o aplicativo tenha o mesmo tamanho quando o aplicativo for reaberto novamente.
A princípio pensei em manipular o evento SizeChanged e salvar Height e Width, mas acho que deve haver uma solução mais fácil.
Problema bastante simples, mas não consigo encontrar uma solução fácil para ele.
Respostas:
Salve os valores no arquivo user.config.
Você precisará criar o valor no arquivo de configurações - ele deve estar na pasta Propriedades. Crie cinco valores:
Top
do tipodouble
Left
do tipodouble
Height
do tipodouble
Width
do tipodouble
Maximized
do tipobool
- para manter se a janela está maximizada ou não. Se você quiser armazenar mais informações, será necessário um tipo ou estrutura diferente.Inicialize os dois primeiros para 0 e os dois segundos para o tamanho padrão do seu aplicativo, e o último para falso.
Crie um manipulador de eventos Window_OnSourceInitialized e adicione o seguinte:
NOTA: O posicionamento da janela definida precisa ir no evento inicializado na origem da janela, não no construtor, caso contrário, se você tiver a janela maximizada em um segundo monitor, ela sempre reiniciará maximizada no monitor principal e você não poderá para acessá-lo.
Crie um manipulador de eventos Window_Closing e adicione o seguinte:
Isso falhará se o usuário diminuir a área de exibição - desconectando uma tela ou alterando a resolução da tela - enquanto o aplicativo estiver fechado, portanto, você deve adicionar uma verificação de que o local e o tamanho desejados ainda são válidos antes de aplicar os valores.
fonte
Na verdade, você não precisa usar code-behind para fazer isso (exceto para salvar as configurações). Você pode usar uma extensão de marcação personalizada para vincular o tamanho e a posição da janela às configurações como estas:
Você pode encontrar o código para esta extensão de marcação aqui: http://www.thomaslevesque.com/2008/11/18/wpf-binding-to-application-settings-using-a-markup-extension/
fonte
{Binding Settings.Height}
etc.Embora você possa "rolar seu próprio" e salvar manualmente as configurações em algum lugar, e em geral isso funcionará, é muito fácil não lidar com todos os casos corretamente. É muito melhor deixar o sistema operacional fazer o trabalho por você, chamando GetWindowPlacement () na saída e SetWindowPlacement () na inicialização. Ele lida com todos os casos extremos malucos que podem ocorrer (vários monitores, salve o tamanho normal da janela se ela for fechada enquanto maximizada, etc.) para que você não precise fazer isso.
Este exemplo do MSDN mostra como usá-los com um aplicativo WPF. O exemplo não é perfeito (a janela começará no canto superior esquerdo o menor possível na primeira execução e há algum comportamento estranho com o designer de configurações salvando um valor do tipo
WINDOWPLACEMENT
), mas deve pelo menos ajudá-lo a começar.fonte
A vinculação de "forma longa" que Thomas postou acima quase não requer codificação, apenas certifique-se de ter a vinculação de namespace:
Em seguida, para economizar no code-behind:
fonte
WindowState="{Binding Source={x:Static properties:Settings.Default}, Path=WindowState, Mode=TwoWay}"
Como alternativa, você também pode gostar da abordagem a seguir ( consulte a fonte ). Adicione a classe WindowSettings ao seu projeto e insira
WindowSettings.Save="True"
no cabeçalho da janela principal:Onde WindowSettings é definido da seguinte forma:
fonte
A maneira padrão de resolver isso é usar arquivos de configurações. O problema com os arquivos de configurações é que você precisa definir todas as configurações e escrever o código que copia os dados para frente e para trás você mesmo. Bastante entediante se você tiver muitas propriedades para controlar.
Eu fiz uma biblioteca bastante flexível e fácil de usar para isso, você apenas informa quais propriedades de qual objeto rastrear e ela faz o resto. Você também pode configurar a porcaria se quiser.
A biblioteca é chamada Jot (github) , aqui está um antigo artigo CodeProject que escrevi sobre ela.
Veja como você pode usá-lo para controlar o tamanho e a localização de uma janela:
Arquivos Jot vs. configurações: Com Jot há consideravelmente menos código e é muito menos sujeito a erros, pois você só precisa mencionar cada propriedade uma vez . Com os arquivos de configuração, você precisa mencionar cada propriedade 5 vezes : uma vez ao criar explicitamente a propriedade e mais quatro vezes no código que copia os valores de um lado para outro.
Armazenamento, serialização etc. são totalmente configuráveis. Além disso, ao usar o IOC, você pode até conectá-lo para que aplique o rastreamento automaticamente a todos os objetos que ele resolve, de modo que tudo o que você precisa fazer para tornar uma propriedade persistente é inserir um atributo [Trackable] nela.
Estou escrevendo tudo isso porque acho que a biblioteca é excelente e quero falar sobre isso.
fonte
Eu escrevi uma aula rápida que faz isso. É assim que se chama:
E aqui está o código:
fonte
Existe um NuGet Project RestoreWindowPlace see no github que faz tudo isso para você, salvando as informações em um arquivo XML.
Para fazê-lo funcionar em uma janela, é tão simples quanto chamar:
((App)Application.Current).WindowPlace.Register(this);
No App você cria a classe que gerencia suas janelas. Veja o link do github acima para mais informações.
fonte
Você pode gostar disso:
Quando o aplicativo fecha:
Quando o aplicativo é iniciado:
fonte
Crie uma string chamada WindowXml nas configurações padrão.
Use este método de extensão em seus eventos Window Loaded e Closing para restaurar e salvar o tamanho e localização da janela.
fonte
Estou usando a resposta de Lance Cleveland e vinculo o cenário. Mas estou usando um pouco mais de código para evitar que minha janela fique fora da tela.
fonte
Fiz uma solução mais genérica com base na resposta brilhante da RandomEngys. Ele salva a posição para o arquivo na pasta em execução e você não precisa criar novas propriedades para cada nova janela que criar. Esta solução funciona muito bem para mim com o mínimo de código no code-behind.
Em seu código atrás de você adiciona estes dois métodos
na janela xaml você adiciona isto
fonte