usar - ¿Cómo crear un tipo de interfaz de diálogo de preferencias de vista de árbol en C#?
que es una interfaz en programacion orientada a objetos (3)
Estoy escribiendo una aplicación que básicamente es solo un diálogo de preferencias, al igual que el diálogo de preferencias de vista de árbol que usa Visual Studio. La función de la aplicación es simplemente un traspaso de datos desde un dispositivo en serie a un archivo. Realiza muchas, muchas transformaciones en los datos antes de escribirlos en el archivo, por lo que la GUI para la aplicación es simplemente todas las configuraciones que dictan cuáles deberían ser esas transformaciones.
¿Cuál es la mejor manera de diseñar / codificar un diálogo de preferencias de vista de árbol? La forma en que he estado trabajando es construir la ventana principal con un control de árbol acoplado a la izquierda. Luego he estado creando controles de contenedor que corresponden a cada nodo del árbol. Cuando se selecciona un nodo, la aplicación lleva el control del contenedor correspondiente de ese nodo al frente, lo mueve a la posición correcta y lo maximiza en la ventana principal. Esto parece realmente, realmente torpe al diseñarlo. Básicamente significa que tengo toneladas de controles de contenedores más allá del borde de la ventana principal durante el tiempo de diseño que tengo que seguir desplazando la ventana principal para trabajar con ellos. No sé si esto tiene mucho sentido en la forma en que estoy escribiendo esto, pero tal vez esta visión para lo que estoy diciendo tenga más sentido:
Básicamente tengo que trabajar con esta enorme forma, con controles de contenedores por todos lados, y luego hacer un montón de reformateo en tiempo de ejecución para que todo funcione. Esto parece mucho trabajo extra. ¿Estoy haciendo esto de una manera totalmente estúpida? ¿Hay alguna manera "obvia" más fácil de hacer esto que me estoy perdiendo?
Greg Hurlman escribió:
¿Por qué no simplemente mostrar / ocultar el contenedor apropiado cuando se selecciona un nodo en la grilla? Haga que los contenedores tengan el tamaño adecuado en el mismo lugar y oculte todos los valores predeterminados, que se preseleccionarán en la cuadrícula al momento de la carga.
Desafortunadamente, eso es lo que trato de evitar. Estoy buscando una manera fácil de manejar la interfaz durante el tiempo de diseño, con un código de reformateo mínimo necesario para que funcione durante el tiempo de ejecución.
Me gusta la respuesta de Duncan porque significa que el diseño de la interfaz de cada nodo se puede mantener completamente separado. Esto significa que no me superpongo a las pautas de ajuste ni a otras ventajas de tiempo de diseño.
Probablemente crearía varias clases de panel basadas en una clase base heredando CustomControl. Estos controles tendrían métodos como Guardar / Cargar y cosas así. Si es así, puedo diseñar cada uno de estos paneles por separado.
He utilizado un control Wizard que, en modo de diseño, manejaba varias páginas, de modo que se podía hacer clic en el diseñador y diseñar todas las páginas a la vez a través del diseñador. Aunque esto tenía varias desventajas cuando se conectaba el código a los controles, probablemente significa que podría tener una configuración similar creando algunas clases de diseñador. Nunca he escrito clases de diseño en VS, así que no puedo decir cómo o si vale la pena :-)
Tengo curiosidad de cómo piensas manejar la carga / guardado de valores hacia / desde los controles. Debe haber un montón de código en una clase si todas sus páginas están en una gran forma?
Y otra forma sería, por supuesto, generar el código GUI a medida que se solicite cada página, usando información sobre qué tipo de configuración hay.
Una manera más ordenada es crear formularios separados para cada ''panel'' y, en cada constructor de formularios, establecer
this.TopLevel = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Dock = DockStyle.Fill;
De esta forma, cada una de estas formas se puede diseñar en su propio diseñador, crear instancias una o más veces en tiempo de ejecución y agregarse al área vacía como un control normal.
Quizás el formulario principal podría usar un SplitContainer
con un TreeView
estático en un panel y espacio para agregar estos formularios en el otro. Una vez que se agregan, se pueden pasar usando los métodos Hide/Show
o BringToFront/SendToBack
.
SeparateForm f = new SeparateForm();
MainFormSplitContainer.Panel2.Controls.Add(f);
f.Show();