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

Как сделать все элементы управления пропорционально пропорционально изменяемыми, когда окно максимизируется?

Когда я нажимал кнопку максимизации, окно максимизируется, но элементы управления не изменяются пропорционально. Каков наилучший способ изменить размер элементов управления? Я использую MVVM. Спасибо,

Edit:

Вот мой код.

<Window x:Class="DataTransfer.View.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Icon="/DataTransfer;component/View/Images/ms_msnexplore.gif"

        ResizeMode="CanResizeWithGrip"
        Title="Window1" Height="500" Width="600">
    <!--Style="{DynamicResource OfficeStyle}"-->
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <!--<ResourceDictionary Source="/DataTransfer;component/View/WindowBase.xaml" />-->
                <!--<ResourceDictionary Source="/DataTransfer;component/Themes/WPFThemes/CalendarResource.xaml" />-->
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

    <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width ="*" />
    </Grid.ColumnDefinitions>
        <Button Content="Button" HorizontalAlignment="Left" Margin="52,28,0,0" VerticalAlignment="Top" Width="75" Height="22" />
        <DatePicker Name="dp" HorizontalAlignment="Left" Margin="175,25,0,0" VerticalAlignment="Top" Width="123" Text="aaa" GotFocus="DateGotFocused" LostFocus="OnLeaveArchiveDate"/>
        <Calendar HorizontalAlignment="Left" Margin="47,162,0,0" VerticalAlignment="Top"/>
        <TextBox Name="t1" HorizontalAlignment="Left" Height="23" Margin="337,23,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" LostFocus="LeaveField" />
        <RadioButton Content="RadioButton" HorizontalAlignment="Left" Margin="88,92,0,0" VerticalAlignment="Top"/>
        <CheckBox Content="CheckBox" HorizontalAlignment="Left" Margin="252,96,0,0" VerticalAlignment="Top"/>
        <ComboBox Name="combo" IsEditable="False" Text="aaa" IsReadOnly="True"
                  HorizontalAlignment="Left" Margin="337,89,0,0" VerticalAlignment="Top" Width="120" 
                  Focusable="True" GotFocus="ComboBoxGotFocused" >
            <ComboBoxItem>January</ComboBoxItem>
            <ComboBoxItem>February</ComboBoxItem>
        </ComboBox>
        <TextBlock HorizontalAlignment="Left" Height="40" Margin="260,184,0,0" TextWrapping="Wrap" Text="Text_Block" VerticalAlignment="Top" Width="257"/>

    </Grid>
</Window>
4b9b3361

Ответ 1

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

Вот некоторые, которые не изменяют размер содержимого (я предполагаю, что вы используете один или несколько из них):

StackPanel
WrapPanel
Canvas
TabControl

Вот некоторые, которые изменяют размер содержимого:

Grid
UniformGrid
DockPanel

Поэтому почти всегда предпочтительнее использовать Grid вместо StackPanel, если вы не хотите автоматического изменения размера. Обратите внимание, что все еще возможно, чтобы Grid не изменял свои внутренние элементы управления... все зависит от ваших настроек Grid.RowDefinition и Grid.ColumnDefinition:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="100" /> <!--<<< Exact Height... won't resize -->
        <RowDefinition Height="Auto" /> <!--<<< Will resize to the size of contents -->
        <RowDefinition Height="*" /> <!--<<< Will resize taking all remaining space -->
    </Grid.RowDefinitions>
</Grid>

Подробнее о элементе управления Grid можно узнать на странице Grid Класс в MSDN. Вы также можете узнать больше об этих элементах управления контейнером на странице WPF Container Controls Overview на MSDN.

Дальнейшее изменение размера может быть достигнуто с помощью свойств FrameworkElement.HorizontalAlignment и FrameworkElement.VerticalAlignment. Значением по умолчанию для этих свойств является Stretch, который растягивает элементы в соответствии с размером их элементов управления. Однако, когда они установлены на любое другое значение, элементы не будут растягиваться.

ОБНОВЛЕНИЕ → >

В ответ на вопросы в вашем комментарии:

Используйте настройки Grid.RowDefinition и Grid.ColumnDefinition, чтобы сначала организовать базовую структуру... обычно нужно добавлять элементы управления Grid в ячейки внешних Grid элементов управления, если это необходимо. Вы также можете использовать свойства Grid.ColumnSpan и Grid.RowSpan, чтобы включить элементы управления для размещения нескольких столбцов и/или строк Grid.

Наиболее распространено иметь хотя бы одну строку/столбец с Height/Width of "*", который заполнит все оставшееся пространство, но вы можете иметь два или более с этим параметром, и в этом случае оставшееся пространство будет разделено между двумя (или более) строками/столбцами. "Авто" - хорошая настройка для строк/столбцов, которые не установлены в "* *", но это действительно зависит от того, как вы хотите, чтобы макет был.

Нет настроек Auto, которые вы можете использовать в элементах управления в ячейках, но это так же хорошо, потому что мы хотим, чтобы Grid определял размеры элементов управления для нас... поэтому мы не хотите установить Height или Width этих элементов управления вообще.

То, что я сделал о свойствах FrameworkElement.HorizontalAlignment и FrameworkElement.VerticalAlignment, было просто, чтобы вы знали об их существовании... поскольку их значение по умолчанию уже Stretch, вам обычно не нужно явно устанавливать их.

Свойство Margin, как правило, просто используется для равномерного распределения ваших элементов управления... если вы перетаскиваете элементы управления из Visual Studio Toolbox, VS устанавливает свойство Margin, чтобы разместить ваш контроль точно там, где вы его сбросили но, как правило, это не то, что мы хотим, так как это будет бесполезно с автоматическим выбором элементов управления. Если вы это сделаете, просто удалите или отредактируйте свойство Margin в соответствии с вашими потребностями.

Ответ 2

Ну, это довольно просто сделать.

В окне обработчика события resize вычислите, сколько окна выросло/сжато, и используйте эту фракцию для настройки 1) Высота, 2) Ширина, 3) Canvas.Top, 4) Свойства Canvas.Left для всего дочернего элемента элементы управления внутри холста.

Здесь код:

private void window1_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            myCanvas.Width = e.NewSize.Width;
            myCanvas.Height = e.NewSize.Height;

            double xChange = 1, yChange = 1;

            if (e.PreviousSize.Width != 0)
            xChange = (e.NewSize.Width/e.PreviousSize.Width);

            if (e.PreviousSize.Height != 0)
            yChange = (e.NewSize.Height / e.PreviousSize.Height);

            foreach (FrameworkElement fe in myCanvas.Children )
            {   
                /*because I didn't want to resize the grid I'm having inside the canvas in this particular instance. (doing that from xaml) */            
                if (fe is Grid == false)
                {
                    fe.Height = fe.ActualHeight * yChange;
                    fe.Width = fe.ActualWidth * xChange;

                    Canvas.SetTop(fe, Canvas.GetTop(fe) * yChange);
                    Canvas.SetLeft(fe, Canvas.GetLeft(fe) * xChange);

                }
            }
        }

Ответ 3

Вы также можете использовать значения HorizontalAlignment, VerticalAlignment и Margin, чтобы сохранить элементы управления внутри панели стека, где вы хотите, чтобы они были