Por que Você Não Pode Vincular o Tamanho de um Formulário do Windows às ApplicationSettings?

Como desenvolvedores que trabalham com Formulários do Windows, muitas vezes buscamos maneiras de melhorar a experiência do usuário mantendo os estados da aplicação. Uma pergunta comum que surge ao usar ApplicationSettings com Formulários do Windows é: Por que você não pode vincular o tamanho de um Formulário do Windows diretamente às ApplicationSettings?

Essa limitação pode ser frustrante, especialmente quando outras propriedades parecem ser vinculadas sem esforço. No entanto, existe uma maneira de enfrentar esse problema e garantir que o estado e o tamanho da janela da sua aplicação sejam salvos entre as sessões. Vamos explorar a raiz da questão e examinar a solução em detalhes mais claros.

Compreendendo a Restrição

Quando você tenta vincular o tamanho de um Formulário do Windows diretamente às ApplicationSettings, pode notar que a propriedade Size está ausente da lista de Binding de Propriedades. Isso ocorre porque o tamanho do formulário não pode ser simplesmente vinculado; geralmente, requer mais contexto devido à necessidade de salvar o estado do formulário quando ele está maximizado ou minimizado.

Por Que o Tratamento Explícito é Necessário

  • Restaurando o Estado: Vincular diretamente ao tamanho não contabilizaria possíveis mudanças no estado do formulário (por exemplo, se ele está minimizado ou maximizado).
  • Uso de Propriedades Adicionais: Quando um formulário não está em seu estado normal, o tamanho deve ser recuperado da RestoreBounds, que não é atualizado através de um binding simples.

A Solução: Implementando uma Classe RestorableForm

Para contornar efetivamente essa limitação, uma subclasse de Form pode ser criada—vamos chamá-la de RestorableForm. Esta classe irá gerenciar o tamanho e o estado da janela da aplicação de forma automática, implementando as substituições e vinculações necessárias.

Implementação Passo a Passo

  1. Herda da RestorableForm ao invés do Form padrão.

  2. Adicione um Binding para WindowRestoreState.

    • Este binding irá capturar e salvar a posição e o estado da janela.
  3. Invocar o Save das Configurações ao Fechar a Aplicação.

    • Chame Properties.Settings.Default.Save() ao fechar a janela para garantir que todas as configurações sejam armazenadas.

Exemplo de Código

Aqui está uma implementação concisa da classe RestorableForm:

using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace Utilities
{
    public class RestorableForm : Form, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private WindowRestoreStateInfo windowRestoreState;

        [Browsable(false)] 
        [SettingsBindable(true)] 
        public WindowRestoreStateInfo WindowRestoreState
        {
            get { return windowRestoreState; }
            set
            {
                windowRestoreState = value;
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("WindowRestoreState"));
            }
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            WindowRestoreState = new WindowRestoreStateInfo
            {
                Bounds = WindowState == FormWindowState.Normal ? Bounds : RestoreBounds,
                WindowState = WindowState
            };
            base.OnClosing(e);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            if (WindowRestoreState != null)
            {
                Bounds = ConstrainToScreen(WindowRestoreState.Bounds);
                WindowState = WindowRestoreState.WindowState;
            }
        }

        private Rectangle ConstrainToScreen(Rectangle bounds)
        {
            // Lógica de restrição aqui...
        }

        public class WindowRestoreStateInfo
        {
            public Rectangle Bounds { get; set; }
            public FormWindowState WindowState { get; set; }
        }
    }
}

Pontos-Chave no Código

  • Tratamento de Propriedade: A propriedade WindowRestoreState captura tanto a posição quanto o estado.
  • Carregando e Salvando Estados: Os métodos substituídos cuidam de restaurar a posição e gerenciar o estado da janela ao fechar.
  • Restrições de Tela: O método ConstrainToScreen garante que o formulário se ajuste à tela, o que é crítico ao restaurar seu tamanho e posição.

Referências para Aprendizado Adicional

Para mais informações sobre os componentes usados na classe RestorableForm, você pode achar estes links valiosos:

Conclusão

Vincular o Tamanho de um Formulário do Windows diretamente às ApplicationSettings apresenta desafios, mas com a classe RestorableForm, você pode garantir que sua aplicação lembre seu estado entre as sessões. Ao implementar um manejo explícito de estado, você capacita os usuários a terem uma experiência mais consistente e personalizada ao usar sua aplicação.

Com essa abordagem, você pode gerenciar efetivamente o tamanho e o estado de seus Formulários do Windows e criar aplicações amigáveis que parecem responsivas e intuitivas.