@postya

Как сделать свойство margin для контейнеров или кнопок резиновым?

Приложение на C# + WPF

Имеется 4 кнопки в stack panel

у stack panel и у кнопок есть определенный отступ(margin)

У меня всё,что находится в рпограмме ресайзится если растяну или сужу окно, то есть изменю размер окна программы.
Но проблема в том,что margin то у всех контролов остается один и тот же, и соотвтетсвенно при другом размере окна программы все выглядит иначе

Как можно сделать margin не абсолютным, а относительным?

при обычном размере окна:
5e08f4e27bf8e338816388.jpeg

при другом размере окна:
5e08f4e768d1e191530306.jpeg

<StackPanel x:Name="optionsMenuBox"
                      Grid.Column="1"
                      Grid.Row="1"
                      Grid.ColumnSpan="5"
                      Margin="0 0 500 0"
                        Background="#535353"
                        Orientation="Horizontal">
                    <Button Click="ChangeCategoryColor"
                            x:Name="ColorPicker"  
                            Margin="70 20 20 20"
                            Style="{StaticResource OptionButton}">
                        <Image Source="images/icons/palette.png"
                               Stretch="Uniform" />
                    </Button>
                
                <Button Click="OpenFontWindow"
                        x:Name="FontWindowButton"
                        Margin="0 20 20 20"
                        Style="{StaticResource OptionButton}">
                    <Image Source="images/icons/fonts.png"
                           Stretch="Uniform" />
                </Button>

                <Button Click="OpenQuestWindow"
                        x:Name="QuestWindowButton"
                        Margin="0 20 20 20"
                        Style="{StaticResource OptionButton}">
                    <Image Source="images/icons/questcards.png"
                           Stretch="Uniform" />
                </Button>

                <Button Click="OpenSentenceWindow"
                        x:Name="SentenceWindowButton"
                        Margin="0 20 20 20"
                        Style="{StaticResource OptionButton}">
                    <Image Source="images/icons/non-quest-cards.png"
                           Stretch="Uniform" />
                </Button>
            </StackPanel>
  • Вопрос задан
  • 568 просмотров
Решения вопроса 1
@Livis49
Вся суть WPF, уход от того, чтобы элементы были строго прилеплены как было на WindowForms. И при ресайзе все элементы должны сохранять не определённые размеры, а именно пропорции своего местоположения. Именно поэтому используется разметка.
Не стоит всё размещать в один Grid. Поэтому всё и ползёт. Так же не стоит использовать Column и описывать месторасположение контента через Grid.Column/Row. Так как при добавлении новых Grid всю эту нумерацию придётся менять. Если выравнивать именно содержание в StackPanel, то лучше использовать Padding, а не Margin. Так же покопаться стоит в выравнивании так как определенные численные значения такими же и останутся при ресайзе.
Доработал код с точки зрения Grid, лучше для каждого элемента прописывать свой, тогда всё останется на своих местах. Так же с точки зрения MVVM в XAML не нужно закидывать взаимодействия. Это всё прописывается в CS там это я и написал, имена кнопок оставил те же . В XAML лишь задаётся имя элемента и уже через него в cs идёт взаимодействие там его и прописал, имена оставил те же, они указаны в XAML.
5e3472e9ca975631382019.jpeg
5e34730f93887686558450.jpeg

XAML не прикрепился( поэтому скрин5e3474c03ecac423021172.jpeg((
CS

public MainWindow()
{
InitializeComponent();
}

private void ColorPicker_Click(object sender, RoutedEventArgs e)
{

}

private void FontWindowButton_Click(object sender, RoutedEventArgs e)
{

}

private void QuestWindowButton_Click(object sender, RoutedEventArgs e)
{

}

private void SentenceWindowButtonr_Click(object sender, RoutedEventArgs e)
{

}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы