最大化ボタンをクリックすると、ウィンドウは最大化されますが、コントロールは比例してサイズ変更されません。それに応じてコントロールのサイズを変更する最良の方法は何ですか? 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>
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
プロパティを削除または編集します。
まあ、それは非常に簡単です。
ウィンドウサイズ変更イベントハンドラーで、ウィンドウがどれだけ成長/縮小したかを計算し、その分数を使用して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);
}
}
}