2008-08-06 9 views
13

Estoy escribiendo una aplicación que es básicamente un diálogo de preferencias, muy parecido al diálogo de preferencias de vista de árbol que Visual Studio utiliza. 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.¿Cómo crear un tipo de interfaz de diálogo de preferencias de vista de árbol en C#?

¿Cuál es la mejor forma de diseñar/codificar un cuadro de 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 sentido totalmente la forma en que estoy escribiendo esto, pero tal vez esto visual de lo que estoy hablando tendrá más sentido:

form design

Básicamente tengo que trabajar con este forma enorme, 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 un lote de 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?

Respuesta

10

Una forma más ordenada es crear formas separadas para cada 'panel' y, en cada constructor del formulario, establezca

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

De esta manera, cada una de estas formas pueden ser establecidos en su propio diseñador, instanciado uno o más veces en tiempo de ejecución, y agregado 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, pueden pasarse utilizando los métodos Hide/Show o BringToFront/SendToBack.

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

Greg Hurlman escribió:

¿Por qué no mostrar/ocultar el contenedor adecuado cuando se selecciona un nodo en la red? 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.

Lamentablemente, 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 por completo por separado. Esto significa que no me superpongo a las pautas de ajuste ni a otras ventajas de tiempo de diseño.

0

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 siguiente 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, por lo que no puedo decir cómo hacerlo o si vale la pena :-)

Tengo un poco de curiosidad sobre cómo piensa manejar la carga/guardado de valores para/de 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.

Cuestiones relacionadas