c# - sangria - ¿Cuál es la manera fácil de establecer el espaciado entre los elementos en StackPanel?
espacio entre parrafos word 2016 (3)
Encuentro que al crear una cuadrícula dentro del panel de la pila, luego se agrega el número deseado de columnas (o filas) de la siguiente manera:
<StackPanel Grid.Row="1" Grid.Column="0" Height="34" Width="698" Margin="10,5,10,10" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" >
<Grid Width="698" Margin="0,0,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button x:Name="StartButton" Content="Start" Grid.Row="0" Grid.Column="0" Style="{StaticResource 3DButton}" HorizontalAlignment="Center" VerticalAlignment="Center" Width="70" Click="StartButton_Click" />
<Button x:Name="HelpButton" Content="Help" Grid.Row="0" Grid.Column="1" Style="{StaticResource 3DButton}" HorizontalAlignment="Center" VerticalAlignment="Center" Width="70" Click="HelpButton_Click" />
<Button x:Name="ExitButton" Content="Exit" Grid.Row="0" Grid.Column="2" Style="{StaticResource 3DButton}" HorizontalAlignment="Center" VerticalAlignment="Center" Width="70" Click="ExitButton_Click" Foreground="Red" />
</Grid>
</StackPanel>
¿Hay una manera fácil de establecer el espacio predeterminado entre los elementos dentro de StackPanel para que no tenga que establecer la propiedad Margen en cada elemento?
Si todos los controles son iguales, entonces haga lo que IanR sugirió e implemente un estilo que atrape ese control. si no es así, no puedes crear un estilo predeterminado para una clase base porque simplemente no funcionará.
La mejor manera de situaciones como estas es usar un truco muy bueno: propiedades adjuntas (también conocidas como Comportamientos en WPF4)
puedes crear una clase que tenga una propiedad adjunta, así:
public class MarginSetter
{
public static Thickness GetMargin(DependencyObject obj)
{
return (Thickness)obj.GetValue(MarginProperty);
}
public static void SetMargin(DependencyObject obj, Thickness value)
{
obj.SetValue(MarginProperty, value);
}
// Using a DependencyProperty as the backing store for Margin. This enables animation, styling, binding, etc...
public static readonly DependencyProperty MarginProperty =
DependencyProperty.RegisterAttached("Margin", typeof(Thickness), typeof(MarginSetter), new UIPropertyMetadata(new Thickness(), CreateThicknesForChildren));
public static void CreateThicknesForChildren(object sender, DependencyPropertyChangedEventArgs e)
{
var panel = sender as Panel;
if (panel == null) return;
foreach (var child in panel.Children)
{
var fe = child as FrameworkElement;
if (fe == null) continue;
fe.Margin = MarginSetter.GetMargin(panel);
}
}
}
ahora, para usarlo, todo lo que necesita hacer es adjuntar esta propiedad adjunta a cualquier panel que desee, así:
<StackPanel local:MarginSetter.Margin="10">
<Button Content="hello " />
<Button Content="hello " />
<Button Content="hello " />
<Button Content="hello " />
</StackPanel>
Completamente reutilizable por supuesto.
Yo uso un separador transparente, que funciona bien:
<Separator Opacity="0" Height="20"/>
Por supuesto, puede usar márgenes, pero luego, si desea cambiar los márgenes, debe actualizar todos los elementos.
El separador puede incluso ser estilizado en un recurso estático.
Una propiedad adjunta podría hacerlo también, pero creo que es una exageración.