web-dev-qa-db-ja.com

ウィンドウが最大化されたときに比例してすべてのコントロールのサイズを変更するにはどうすればよいですか?

最大化ボタンをクリックすると、ウィンドウは最大化されますが、コントロールは比例してサイズ変更されません。それに応じてコントロールのサイズを変更する最良の方法は何ですか? MVVMを使用しています。

これが私のコードです。

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

WPFには、コンテンツを自動的にサイズ変更する特定の「コンテナ」コントロールがありますが、そうでないものもあります。

以下に、コンテンツのサイズを変更するnotをいくつか示します(これらの1つ以上を使用していると推測しています)。

StackPanel
WrapPanel
Canvas
TabControl

以下に、コンテンツのサイズを変更するdoをいくつか示します。

Grid
UniformGrid
DockPanel

したがって、not自動サイズ変更を行わない限り、Gridの代わりにStackPanelを使用することがほぼ常に推奨されます。 。 Gridが内部コントロールのサイズをnotにすることはまだ可能であることに注意してください...それはすべて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コントロールの詳細については、MSDNの Grid Class ページをご覧ください。これらのコンテナーコントロールの詳細については、MSDNの WPFコンテナーコントロールの概要 ページをご覧ください。

FrameworkElement.HorizontalAlignment および FrameworkElement.VerticalAlignment プロパティを使用して、さらにサイズ変更を行うことができます。これらのプロパティのデフォルト値はStretchです。これは、含まれるコントロールのサイズに合わせて要素を拡大します。ただし、他の値に設定すると、要素はnot伸縮します。

更新>>>

コメントの質問への回答:

Grid.RowDefinitionおよびGrid.ColumnDefinition設定を使用して、最初に基本構造を編成します...必要に応じて、Gridコントロールを外側のGridコントロールのセルに追加するのが一般的です。また、Grid.ColumnSpanおよびGrid.RowSpanプロパティを使用して、コントロールがGridの複数の列または行、あるいはその両方に及ぶようにすることもできます。

Height/Width"*"の行/列を少なくとも1つ持つのが最も一般的ですが、残りのすべてのスペースを埋めることができますが、この設定で2つ以上持つことができます。スペースは2つ(またはそれ以上)の行/列に分割されます。 「自動」は、「*」に設定されていない行/列に使用するのに適した設定ですが、実際にレイアウトをどのようにしたいかによって異なります。

セル内のコントロールで使用できるAuto設定はありませんが、Gridを使用してコントロールのサイズを調整する必要があるため、これも同様です。したがって、これらのコントロールのHeightまたはWidthをまったく設定したくない。

FrameworkElement.HorizontalAlignmentプロパティとFrameworkElement.VerticalAlignmentプロパティについて私が述べたポイントは、それらの存在を知らせることだけでした。デフォルト値はすでにStretchであるため、通常は明示的に設定する必要はありません。

Marginプロパティは通常、コントロールを均等に配置するために使用されます... Visual Studio Toolboxからコントロールをドラッグアンドドロップすると、VSはMarginプロパティを設定して、ドロップした場所にコントロールを配置します。しかし、一般的に、これはコントロールの自動サイズ変更を台無しにするため、notではありません。これを行う場合は、必要に応じてMarginプロパティを削除または編集します。

86
Sheridan

まあ、それは非常に簡単です。

ウィンドウサイズ変更イベントハンドラーで、ウィンドウがどれだけ成長/縮小したかを計算し、その分数を使用して1)Height、2)Width、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
Ron16