Como criar um tipo de interface de diálogo de preferências de visualização em árvore em C#?

StackOverflow https://stackoverflow.com/questions/3725

  •  08-06-2019
  •  | 
  •  

Pergunta

Estou escrevendo um aplicativo que é basicamente apenas uma caixa de diálogo de preferências, muito parecida com a caixa de diálogo de preferências de exibição em árvore que o próprio Visual Studio usa.A função do aplicativo é simplesmente passar dados de um dispositivo serial para um arquivo.Ele executa muitas, muitas transformações nos dados antes de gravá-los no arquivo, portanto, a GUI do aplicativo é simplesmente todas as configurações que determinam quais devem ser essas transformações.

Qual é a melhor maneira de projetar/codificar uma caixa de diálogo de preferências de visualização em árvore?A maneira como estou fazendo isso é construir a janela principal com um controle de árvore encaixado à esquerda.Depois, criei controles de contêiner que correspondem a cada nó da árvore.Quando um nó é selecionado, o aplicativo traz o controle de contêiner correspondente desse nó para a frente, move-o para a posição correta e maximiza-o na janela principal.Isso parece muito, muito desajeitado ao projetá-lo.Basicamente, significa que tenho vários controles de contêiner além da borda da janela principal durante o tempo de design, para os quais preciso continuar rolando a janela principal para trabalhar com eles.Não sei se isso faz sentido do jeito que estou escrevendo, mas talvez esse visual para o que estou falando faça mais sentido:

form design

Basicamente, tenho que trabalhar com esse formulário enorme, com controles de contêiner em todos os lugares, e depois fazer várias reformatações em tempo de execução para fazer tudo funcionar.Isto parece um muito de trabalho extra.Estou fazendo isso de uma maneira totalmente estúpida?Existe alguma maneira mais fácil e "óbvia" de fazer isso que estou perdendo?

Foi útil?

Solução

Uma maneira mais organizada é criar formulários separados para cada 'painel' e, em cada construtor de formulário, definir

this.TopLevel = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Dock = DockStyle.Fill;

Dessa forma, cada um desses formulários pode ser disposto em seu próprio designer, instanciado uma ou mais vezes em tempo de execução e adicionado à área vazia como um controle normal.

Talvez o formulário principal pudesse usar um SplitContainer com uma estática TreeView em um painel e espaço para adicionar esses formulários no outro.Depois de adicionados, eles podem ser folheados usando Hide/Show ou BringToFront/SendToBack métodos.

SeparateForm f = new SeparateForm(); 
MainFormSplitContainer.Panel2.Controls.Add(f); 
f.Show();

Outras dicas

Greg Hurlman escreveu:

Por que não apenas mostrar/ocultar o contêiner adequado quando um nó é selecionado na grade?Coloque todos os contêineres dimensionados adequadamente no mesmo local e oculte todos, exceto o padrão, que seria pré-selecionado na grade durante o carregamento.

Infelizmente, é isso que estou tentando evitar.Estou procurando uma maneira fácil de lidar com a interface durante o tempo de design, com o mínimo de código de reformatação necessário para fazê-la funcionar durante o tempo de execução.

Gosto da resposta de Duncan porque significa que o design da interface de cada nó pode ser mantido completamente separado.Isso significa que não tenho sobreposição nas diretrizes de ajuste e outras vantagens de tempo de design.

Eu provavelmente criaria várias classes de painel baseadas em uma classe base herdando CustomControl.Esses controles teriam então métodos como Salvar/Carregar e coisas assim.Nesse caso, posso projetar cada um desses painéis separadamente.

Eu usei um controle Wizard que no modo design, manipulou várias páginas, para que se pudesse clicar em próximo no designer e projetar todas as páginas de uma vez através do designer.Embora isso tenha diversas desvantagens ao conectar o código aos controles, provavelmente significa que você poderia ter uma configuração semelhante construindo algumas classes de designer.Eu nunca escrevi nenhuma aula de designer em VS, então não posso dizer como ou se vale a pena :-)

Estou um pouco curioso para saber como você pretende lidar com o carregamento/salvamento de valores de/para os controles?Deve haver muito código em uma classe se todas as suas páginas estiverem em um grande formulário?

E ainda outra maneira seria gerar o código GUI à medida que cada página é solicitada, usando informações sobre os tipos de configurações existentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top