Подтвердить что ты не робот

Каков простой способ установить расстояние между элементами в StackPanel?

Есть ли простой способ установить пространство по умолчанию между элементами внутри StackPanel, поэтому мне не нужно устанавливать свойство Margin для каждого элемента?

4b9b3361

Ответ 1

если все элементы управления одинаковы, тогда сделайте так, как предлагалось IanR, и реализуйте стиль, который ловит этот элемент управления. если это не так, вы не можете создать стиль по умолчанию для базового класса, потому что он просто не будет работать.

лучший способ для подобных ситуаций - использовать очень аккуратные свойства, привязанные к трюку (aka Behaviors в WPF4)

вы можете создать класс с прикрепленным свойством, например:

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);
        }
    }


}

теперь, чтобы использовать его, все, что вам нужно сделать, - это присоединить это прикрепленное свойство к любой панели, которую вы хотите, например:

<StackPanel local:MarginSetter.Margin="10">
    <Button Content="hello " />
    <Button Content="hello " />
    <Button Content="hello " />
    <Button Content="hello " />
</StackPanel>

Полностью повторное использование, конечно.

Ответ 2

Я использую прозрачный разделитель, который хорошо работает:

<Separator Opacity="0" Height="20"/>

Конечно, вы можете использовать поля, но если вы хотите изменить поля, вам необходимо обновить все элементы.

Сепаратор может быть даже создан в статическом ресурсе.

Вложенное свойство может сделать это тоже, но я думаю, что это перебор.

Ответ 3

Я нахожу, что создаю сетку внутри панели стека, затем добавляя необходимое количество столбцов (или строк) следующим образом:

    <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>