2009-12-04 19 views
5

Para hacer una interfaz de usuario conveniente para una aplicación .Net 2.0 Winforms en la que estoy trabajando, necesito un control que estoy bastante seguro que va más allá del comportamiento "fuera de la caja" de cualquier control estándar. Una maqueta de lo que estoy tratando de alcanzar la siguiente manera:Complex .Net 2.0 Windows Forms control: ¿por dónde empezar?

Mock up http://www.claware.com/images/temp/mockup.png

En esencia, esta parte de la aplicación intenta analizar las palabras en sílabas de lenguas tribales (sin diccionario para referirse a; todas y cada una de Unicode los caracteres son posibles.) Para cuando el usuario llega tan lejos, ya ha definido las vocales/consonantes en su idioma y alguna otra configuración. Hay entonces un proceso iterativo de (1) la aplicación adivina qué sílabas existen en el lenguaje según algunas reglas, (2) el usuario refina las suposiciones, selecciona los análisis correctos o analiza manualmente una palabra, (3) la aplicación "aprende" "a partir de los comentarios de los usuarios y hace conjeturas más inteligentes, (4) repita hasta que los datos sean" lo suficientemente buenos "para continuar.

El control debe presentar cada palabra (los encabezados grises), luego todas las suposiciones de ruptura de sílaba (las áreas blancas con puntos que separan las partes de las palabras). También hay una forma de ingresar manualmente un análisis que mostrará un área de texto y botón de guardar (en la parte inferior de la maqueta). Cuando el usuario pasa el cursor sobre una conjetura, el fondo cambia y aparecen los botones "aceptar/rechazar". Al hacer clic en aceptar o ingresar un análisis manual, se elimina la palabra completa de la lista. Al hacer clic en el botón de rechazar, se elimina solo ese elemento.

No estoy de ninguna manera 100% vendido en el formato que tengo arriba, pero creo que se puede tener una idea general de los tipos de formato y control funcional que necesito. El control también se desplazará verticalmente; puede haber miles de palabras inicialmente.

Mi pregunta para usted con experiencia WinForms developers es: ¿por dónde empezar? Realmente me gustaría permanecer dentro del marco central de .Net y extender un control existente en lugar de un control de un tercero. (A riesgo de comenzar una guerra religiosa: sí, sufro de síndrome NIH, pero es una decisión consciente basada en muchas soluciones rápidas pero problemas a largo plazo con controles de terceros). ¿Dónde puedo obtener el máximo beneficio? "bang for my bucK" y la menos reinventando la rueda? ¿Vista de la lista? ¿Cuadro de lista? ScrollableControl? ¿Debo volver a Control y pintar todo de forma manual? ¡Agradezco cualquier ayuda que pueda proporcionarme!

[Editar] Gracias a todos por las ideas. Parece que la solución más elegante para mis propósitos es crear un control personalizado que consta de un FlowLayoutPanel y un VScrollBar. El FlowLayoutPanel puede contener instancias de los controles personalizados utilizados para cada palabra. Pero el FlowLayoutPanel es virtual, es decir, solo contiene aquellas instancias que son visibles (y algunas "simplemente sin desplazamiento"). Los eventos VScrollBar determinan qué debe cargarse. Un poco de código para escribir, pero no está mal y parece funcionar bien.

+0

¿Está obligado a utilizar WPF? En un aspecto, es WinForms + HTML y tus maquetas serían fáciles de usar en Expression Blend. – sipwiz

+0

Lamentablemente, sí. A menudo tengo esos momentos de "hombre, realmente me gustaría poder usar WPF". –

+0

Me interesaría ver el artículo terminado ... – cjk

Respuesta

4

Me gustaría ver los controles TableLayoutPanel y FlowLayoutPanel. Estos le permitirán organizar una serie de controles con moderada facilidad de una manera vertical. Luego crearía un UserControl que consta de una etiqueta y 2 botones. UserControl expondrá propiedades como Texto y eventos que están expuestos para los clics del botón. Para cada entrada en la lista, creará una instancia de UserControl, asignará el valor del texto y manejará los eventos de clic. La instancia se colocará en el panel Table/Flow en el orden correcto. Ambos paneles de diseño permiten insertar elementos entre otros elementos para que pueda agregar/eliminar elementos de la lista de forma dinámica.

Editar: Dado el tiempo que está tratando de renderizar, consideraría usar DataGridView y hacer algunas representaciones personalizadas para que funcione como usted desea. Usando los eventos de renderización de la DGV puede combinar columnas, cambiar los colores de fondo (como resaltar las líneas grises oscuras), activar/desactivar los botones y manejar el cambio de la grilla en modo edición para sus filas para permitir la modificación o inserción de nuevos valores . Este método manejaría fácilmente grandes conjuntos de datos y podría vincularse directamente a ellos con mucha facilidad.

+0

Para un conjunto de datos más pequeño, esto podría funcionar bastante bien. Pero me había quedado sin controladores de ventana mucho antes de acercarme a cargar los FlowLayoutPanels.Miles de palabras multiplicadas por varios controles de usuario por palabra = demasiado. Tal vez una versión "virtual" de esto, haciendo un seguimiento de la posición de desplazamiento ... –

+0

Me perdí la parte de "miles de palabras" de la pregunta original. Actualizaré mi respuesta con otra posible solución. –

+0

Una versión virtual de los controles personalizados anidados con FlowLayoutPanel va a funcionar. –

0

Así es como yo lo haría:

Crear un control personalizado. En este control personalizado, tenga un ListBox encima de un LinkButton, y cuando haga clic en el LinkButton, puede hacer que dé paso a un TextBox. Los ListBoxes tendrán la fila superior no seleccionable ... probablemente puedas obtener el resto de allí. Al llegar a su lista de palabras, llenar un Scrollable de algún tipo con un control para cada palabra:

(foreach String word in words){ 
    myScrollable.add(new MyComponent(word)); 
} 

A partir de ahí, no estoy seguro de lo que quiere hacer con las cajas o los datos, pero eso es mi idea inicial en la configuración de la interfaz de usuario.

2

Bueno, esto ciertamente parece ser un candidato para un componente personalizado que debería estar creando usted mismo. Puedes crear esto usando el estándar.Comandos netos de dibujo junto con un cuadro de texto y un control de botón regular.

Ahora quiere saber por dónde empezar.

Cree un proyecto de Windows Forms Control Library. Coloque en el cuadro de texto y el control del botón.

El código de dibujo del panel debe realizarse preferiblemente por código. Esto se puede hacer utilizando los comandos regulares de GDI +.

Editar:

Aquí hay otra idea, y uno que he utilizado prácticamente en mi propio proyecto con gran éxito.

Puede usar un control de navegador web en la aplicación y mostrar sus datos como html. Puede actualizar la fuente del control del navegador web en función de la entrada en el cuadro de texto y hacer clic en los enlaces en el control del navegador web le dará el evento que puede atrapar para realizar alguna acción. Tu CSS funcionará.

Utilicé esta técnica para construir el 'escritorio' en una aplicación que hice llamada 'Correct Accounting Software'. A la gente le encantó tanto el escritorio que es una de las características más apreciadas de la aplicación.

+0

Esto suena muy interesante. ¿Cómo manejaron las imágenes? Guárdelos en el directorio temporal y señale las etiquetas allí? ¿O hay una manera más elegante? –

+0

Los puse en una carpeta específica en la aplicación. Creo que es un enfoque perfectamente elegante para eso. –

+0

Aunque al final no terminé yendo a la ruta del navegador web, esta es una idea fascinante en la que nunca había pensado y aprecio la idea. ¡Esto puede ser muy útil en otro proyecto! –

0

Utilice el control WebBrowser y genere el marcado HTML en él utilizando DocumentStream o DocumentText.

Cuestiones relacionadas