Dado un StackPanel:
<StackPanel>
<TextBox Height="30">Apple</TextBox>
<TextBox Height="80">Banana</TextBox>
<TextBox Height="120">Cherry</TextBox>
</StackPanel>
¿Cuál es la mejor manera de espaciar los elementos secundarios para que haya espacios de igual tamaño entre ellos, a pesar de que los elementos secundarios en sí son de diferentes tamaños? ¿Se puede hacer sin establecer propiedades en cada uno de los hijos individuales?
wpf
silverlight
xaml
stackpanel
GraemeF
fuente
fuente
Respuestas:
Use Margen o Relleno, aplicado al alcance dentro del contenedor:
EDITAR: en caso de que desee reutilizar el margen entre dos contenedores, puede convertir el valor del margen en un recurso en un ámbito externo, por ejemplo
y luego se refieren a este valor en el ámbito interno
fuente
Button
.Label
que tiene que usar enPadding
lugar deMargin
Otro buen enfoque se puede ver aquí: http://blogs.microsoft.co.il/blogs/eladkatz/archive/2011/05/29/what-is-the-easiest-way-to-set-spacing-between- items-in-stackpanel.aspx El enlace está roto -> este es el archivo web de este enlace.
Muestra cómo crear un comportamiento adjunto, para que una sintaxis como esta funcione:
Esta es la forma más fácil y rápida de configurar Margen para varios elementos secundarios de un panel, incluso si no son del mismo tipo. (Es decir, botones, cuadros de texto, cuadros combinados, etc.)
fuente
if (fe.ReadLocalValue(FrameworkElement.MarginProperty) == DependencyProperty.UnsetValue)
antes de configurar realmente el margen del elemento secundario permite especificar manualmente los márgenes para algunos elementos.Creo que he mejorado en respuesta Elad Katz .
Código fuente en gist .
Ejemplo:
fuente
ItemsControl
enlace a una colección cambiante. Se supone que los elementos son estáticos desde el momento en que se desencadena elLoad
evento principal.Lo que realmente quieres hacer es envolver todos los elementos secundarios. En este caso, debe usar un control de elementos y no recurrir a propiedades adjuntas horribles que terminará teniendo un millón de por cada propiedad que desee diseñar.
fuente
Margin="0 0 -5 0"
) también contrarrestará el espacio después del último elemento de la lista.+1 por la respuesta de Sergey. Y si desea aplicar eso a todos sus StackPanels, puede hacer esto:
Pero tenga cuidado: si define un estilo como este en su App.xaml (u otro diccionario que se fusiona en Application.Resources), puede anular el estilo predeterminado del control. Para controles en su mayoría sin apariencia, como el panel de pila, no es un problema, pero para cuadros de texto, etc., puede tropezar con este problema , que afortunadamente tiene algunas soluciones.
fuente
Siguiendo la sugerencia de Sergey, puede definir y reutilizar un estilo completo (con varios establecedores de propiedades, incluido el margen) en lugar de solo un objeto de espesor:
...
Tenga en cuenta que el truco aquí es el uso de herencia de estilo para el estilo implícito, heredando del estilo en algún diccionario de recursos externo (probablemente fusionado desde un archivo XAML externo).
Nota al margen:
Al principio, intenté ingenuamente usar el estilo implícito para establecer la propiedad Style del control en ese recurso Style externo (por ejemplo, definido con la clave "MyStyle"):
lo que provocó que Visual Studio 2010 se cerrara inmediatamente con un error de FALLA CATASTROFICA (HRESULT: 0x8000FFFF (E_UNEXPECTED)), como se describe en https://connect.microsoft.com/VisualStudio/feedback/details/753211/xaml-editor-window-fails -with-catastrophic-failure-when-a-style-tries-to-set-style-property #
fuente
Grid.ColumnSpacing , Grid.RowSpacing , StackPanel.Spacing ahora están en la vista previa de UWP, todo permitirá lograr mejor lo que se solicita aquí.
Estas propiedades actualmente solo están disponibles con Windows 10 Fall Creators Update Insider SDK, ¡pero deberían llegar a los bits finales!
fuente
Es posible que UniformGrid no esté disponible en Silverlight, pero alguien lo ha portado desde WPF. http://www.jeff.wilcox.name/2009/01/uniform-grid/
fuente
Mi enfoque hereda StackPanel.
Uso:
Todo lo que se necesita es la siguiente clase corta:
fuente
a veces es necesario configurar el Relleno, no el Margen, para que el espacio entre los elementos sea más pequeño que el predeterminado
fuente