¿Es fácilmente posible especificar un margen y / o relleno para filas o columnas en una cuadrícula WPF?
Por supuesto, podría agregar columnas adicionales para espaciar las cosas, pero esto parece un trabajo para rellenar / márgenes (dará XAML mucho más simple). ¿Alguien ha derivado de la cuadrícula estándar para agregar esta funcionalidad?
Respuestas:
Puede escribir su propia
GridWithMargin
clase, heredadaGrid
y anular elArrangeOverride
método para aplicar los márgenes.fuente
RowDefinition
yColumnDefinition
son de tipoContentElement
, yMargin
es estrictamente unaFrameworkElement
propiedad. Entonces a su pregunta, "¿es fácilmente posible" la respuesta es un no definitivo. Y no, no he visto ningún panel de diseño que demuestre este tipo de funcionalidad.Puede agregar filas o columnas adicionales como sugirió. Pero también puede establecer márgenes en un
Grid
elemento en sí mismo, o cualquier cosa que vaya dentro de unGrid
, así que esa es su mejor solución por ahora.fuente
Use un
Border
control fuera del control de celda y defina el relleno para eso:Fuente:
fuente
Podrías usar algo como esto:
O si no necesita los TemplateBindings:
fuente
Pensé que agregaría mi propia solución porque aún nadie mencionó esto. En lugar de diseñar un UserControl basado en Grid, puede apuntar a controles contenidos en grid con una declaración de estilo. Se encarga de agregar relleno / margen a todos los elementos sin tener que definir para cada uno, lo cual es engorroso y requiere mucho trabajo. Por ejemplo, si su Grid no contiene más que TextBlocks, puede hacer esto:
Que es como el equivalente de "relleno de celda".
fuente
Margin
propiedad, es que cualquieraStyle
de ellosResourceDictionary
se aplicará a cada elemento deTargetType
todas partes dentro del alcance completo del elemento propietario de ese diccionario. Entonces es loStyle
que gotea, no la propiedad.Esto no es terriblemente difícil. No puedo decir lo difícil que fue en 2009 cuando se hizo la pregunta, pero eso fue entonces.
Tenga en cuenta que si establece explícitamente un margen directamente en un elemento secundario de la cuadrícula cuando usa esta solución, ese margen aparecerá en el diseñador pero no en el tiempo de ejecución.
Esta propiedad se puede aplicar a Grid, StackPanel, WrapPanel, UniformGrid o cualquier otro descendiente del Panel. Afecta a los niños inmediatos. Se presume que los niños querrán administrar el diseño de sus propios contenidos.
PanelExt.cs
Manifestación:
MainWindow.xaml
MainWindow.xaml.cs
fuente
build
orun
antes de que se pueda mostrar la vista previa en vivo? Buena y simple. 1 de ventaja.Me encontré con este problema mientras desarrollaba algún software recientemente y se me ocurrió preguntar ¿POR QUÉ? ¿Por qué han hecho esto? La respuesta estaba justo frente a mí. Una fila de datos es un objeto, por lo que si mantenemos la orientación del objeto, entonces el diseño de una fila en particular debe separarse (supongamos que necesita reutilizar la visualización de la fila más adelante en el futuro). Entonces comencé a usar paneles de pila de datos y controles personalizados para la mayoría de las pantallas de datos. Las listas han aparecido ocasionalmente, pero la cuadrícula se ha utilizado principalmente para la organización de la página principal (encabezado, área de menú, área de contenido, otras áreas). Sus objetos personalizados pueden administrar fácilmente cualquier requisito de espacio para cada fila dentro del panel de pila o la cuadrícula (una sola celda de cuadrícula puede contener todo el objeto de la fila. Esto también tiene el beneficio adicional de reaccionar adecuadamente a los cambios de orientación,
o
Sus controles personalizados también heredarán el DataContext si está utilizando el enlace de datos ... mi beneficio favorito personal de este enfoque.
fuente
ListView
control WPF enGridView
modo, pero sin prever que todos los "RowObjects" compartan el mismo ancho de columna. En realidad, ya no tiene mucho que ver con una cuadrícula.en uwp (Windows10FallCreatorsUpdate versión y superior)
fuente
Xamarin.Forms
.Editado:
Para dar margen a cualquier control, puede ajustar el control con un borde como este
fuente
Lo hice ahora con una de mis cuadrículas.
fuente
Una posibilidad sería agregar filas y columnas de ancho fijo para que actúen como el relleno / margen que está buscando.
También puede considerar que está limitado por el tamaño de su contenedor y que una cuadrícula será tan grande como el elemento contenedor o su ancho y alto especificados. Simplemente puede usar columnas y filas sin ancho o alto establecido. De esa manera, se separan por defecto para dividir el espacio total dentro de la cuadrícula. Entonces sería una cuestión de centrar sus elementos vertical y horizontalmente dentro de su cuadrícula.
Otro método podría ser envolver todos los elementos de la cuadrícula en una cuadrícula fija con una sola fila y columna que tenga un tamaño y margen fijos. Que su cuadrícula contiene cuadros de ancho / alto fijos que contienen sus elementos reales.
fuente
Recientemente tuve un problema similar en la cuadrícula de dos columnas, necesitaba un margen en los elementos de la columna derecha solamente. Todos los elementos en ambas columnas eran del tipo TextBlock.
fuente
Aunque no puede agregar margen o relleno a una Cuadrícula, puede usar algo como un Marco (o contenedor similar), al que puede aplicarlo.
De esa manera (si muestra u oculta el control en un botón, haga clic en decir), no necesitará agregar margen en cada control que pueda interactuar con él.
Piense en ello como aislando los grupos de controles en unidades, luego aplicando estilo a esas unidades.
fuente
Como se indicó antes, cree una clase GridWithMargins. Aquí está mi ejemplo de código de trabajo
Uso:
fuente
Me sorprende no haber visto esta solución publicada todavía.
Viniendo de la web, los marcos como bootstrap usarán un margen negativo para retirar filas / columnas.
Puede ser un poco detallado (aunque no es tan malo), funciona y los elementos están espaciados y dimensionados de manera uniforme.
En el siguiente ejemplo, uso un
StackPanel
raíz para demostrar cómo los 3 botones están espaciados uniformemente usando márgenes. Podrías usar otros elementos, solo cambia el x: Type interno del botón a tu elemento.La idea es simple: use una cuadrícula en el exterior para sacar los márgenes de los elementos de sus límites a la mitad de la cantidad de la cuadrícula interna (usando márgenes negativos), use la cuadrícula interna para espaciar uniformemente los elementos con la cantidad que desee.
Actualización: Algunos comentarios de un usuario dicen que no funciona, aquí hay un video rápido que demuestra: https://youtu.be/rPx2OdtSOYI
fuente
A veces el método simple es el mejor. Simplemente rellena tus cuerdas con espacios. Si solo se trata de unos pocos cuadros de texto, etc., este es, con mucho, el método más simple.
También puede simplemente insertar columnas / filas en blanco con un tamaño fijo. Extremadamente simple y puedes cambiarlo fácilmente.
fuente