2009-07-02 19 views
11

Estoy buscando opinión sobre el uso de paneles de Canvas vs. Grid en WPF. Necesito hacer formularios de entrada clásicos que tengan diseños de cuadrícula básicamente, algunos pueden tener pequeñas cuadrículas de datos dentro, grupos de cajas, pero todos alineados en el diseño de la cuadrícula. Estoy teniendo problemas para usar el panel Cuadrícula o Lienzo para todos mis formularios. Grid me está dando una buena estructura; Puedo mantener la alineación de los controles más fácilmente -. Tendré la clase base (que hereda la clase Window) para todas las ventanas, por lo que el diseñador en Visual Studio será inútil, ya que tiene problemas para este tipo de herencia, y con el panel Grid realmente ni siquiera necesito diseñador, y puedo establece la ventana SizeToContent para que todo encaje perfectamente. Pero de nuevo con Canvas, tengo la capacidad de colocar controles de cualquier manera que me gusta, y esto es solo un beneficio que veo cuando uso Canvas.Grid vs. Canvas

No tenía mucha experiencia en WPF para predecir qué tipo de problemas podría obtener de las solicitudes de los clientes sobre el diseño. En los formularios web, a veces uso el posicionamiento absoluto para los formularios, en caso de que el cliente tenga alguna solicitud "especial", ya sea que tenga un píxel de control a la derecha o a la izquierda, etc. todo el mundo trabajó para que clientes exigentes sepan a qué me refiero.

Me gustaría ver lo que piensas, ¿cuáles son los pros y los contras de ambos en la creación de diseño de formularios de solicitud de negocios? ¿Por qué es uno mejor que el otro? ¿Algún caso en que un panel sería malo para usar y otro no? ¿Cuáles son las desventajas de un panel a otro? ¿Qué panel usarías?

Gracias

Respuesta

16

lienzo está destinado principalmente para la funcionalidad de dibujo personalizado más que cualquier otra cosa. La cuadrícula es definitivamente la mejor opción disponible para personalizar su diseño.

+0

Estoy de acuerdo con CSharperWithJava - es un elemento mucho más práctico para el diseño general de la interfaz de usuario. – Giffyguy

+1

Te conviene ir con un diseño basado en Grid o Panel. Eche un vistazo a la descripción general de MSDN del sistema de diseño de WPF: http://msdn.microsoft.com/en-us/library/ms745058.aspx – rmoore

+0

Aquí hay un tutorial para que pueda comenzar con los diseños de cuadrícula: http: // www .wpftutorial.net/GridLayout.html – CodeFusionMobile

2

Definitivamente Las rejillas parecen ser lo que necesita para sus necesidades.

Me gustaría comparar Cuadrículas a tablas en html (muy útil cuando se usa apropiadamente), mientras que Canvas es más como un div. La diferencia es que las grillas son las tablas que deben estar en HTML y de manera similar con div's vs Canvas.

En el tema de las cuadrículas, tómese el tiempo para definir sus definiciones de filas y columnas, en lugar de poner márgenes en los controles para colocar todo correctamente. Te arrepentirás si no lo haces.

+2

Huh ... usted sabe que usar tablas para propósitos de diseño no es recomendable, ¿verdad? – luiscubal

+0

en forma absoluta, pero por el bien de este ejemplo quería algo que usar como ejemplo, pensé que sería el mejor ejemplo. Como mencioné, las grillas en WPF son lo que las tablas intentaban ser en HTML. –

3

se puede llegar muy a fondo con la distribución real de la red, la columna/fila de expansión, anchura, altura, etc.

En mi opinión es que sería más fácil de hacer el diseño de los diferentes elementos de una rejilla controlando la fila y la columna sizez que hacer todo codificado en un lienzo. También facilitará las cosas si deciden cambiar las resoluciones más adelante en el futuro.

De Adam Nathan WPF Desencadenada (Pág. 168):

Imitando una lona con la cuadrícula Si deja de cuadrícula con una sola fila y columna y establecer el HorizontalAlignment y VerticalAlignment de todos los niños a valores distintos de Stretch, los niños se agregan a la celda individual como un lienzo. Configuración de la Alineación Horizontal a la Izquierda y Alineación Vertical a la Parte Superior es como configurar la Lona.Izquierda y Lona.Top a 0. Configuración Alineación Horizontal a la Derecha y Alineación Vertical a la Parte Inferior es como establecer Lona.De la Derecha y Lienzo.Abajo de 0.Además, aplicar valores de Margen a cada elemento puede darle el mismo efecto que establecer las propiedades adjuntas de Canvas a los mismos valores .

También puede ser creativo con el contenido de sus controles en la cuadrícula para tener un nivel más fino de control de diseño.

Un lienzo sería bueno para algo así como un cuadro de diálogo que rara vez cambiará de tamaño, y solo tiene unos pocos controles sobre él, ya que llevaría mucho tiempo colocarlos a medida que crezca el número.

Yo personalmente uso las redes yo mismo. Puede ser un poco más de trabajo establecer las cosas al nivel de píxel, pero por el 5% del tiempo que es necesario, vale la pena por abstraer mucho de la molestia. También es bueno cuando hay una necesidad de cambiar el tamaño de filas y columnas sobre la marcha, el GridSplitter lo hace muy fácil.

0

Aunque no puede usar VS Designer, aún puede usar un diseñador visual XAML para crear/editar el contenido de su grilla.

Uno de los principales beneficios de UX de WPF/SL/XAML es la capacidad de diseño "líquido" similar a HTML. Aunque es posible que no lo necesite con su diseño actual, es claramente el futuro y vale la pena aprender a perfeccionarlo. excelente carta de

Comprobar Rob Relyea de disposición XAML editors

+0

Enlace roto, por favor corrige – kbo4sho88

0

Me gustaría ir con una rejilla o una subclase de cuadrícula especializada. Tiene razón sobre Ver herencia. El diseñador de Visual Studio en UWP, WPF genera código de soporte para la base y la subclase con los mismos nombres de método. No compila

Como soy anterior a los genéricos, podemos volver a las metodologías anteriores. Una de estas es una clase de ayuda. Cada Vista implementa IBaseView y tiene una propiedad ViewHelper o ViewHelper<T>. enum ViewHelperOptions bien puede ser necesario. Si es necesario, cada uno de los ViewHelpers puede usar la herencia sin romper Visual Designer. Esto permite el uso de código genérico y código de vista específico sin romper el modelo MVVM. Vamos a llamarlo MVHVM ya que ViewHelper tiene conocimiento del ViewHelper. Esto separa aún más la V de la VM.

La implementación completa bien puede requerir el uso de Activator.CreateInstance. Otra consideración es los constructores que son invocados por el diseñador. Tiene que mover todo el código "will-crash-if-not-running" en una Inicialización generada desde (digamos) el evento Loaded. Como alternativa, puede hacer uso de (UWP):

if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled) 
{ DoStuffWhichShouldOnlyBeDoneAtRunTime(); }