いくつかのタブがあるウィンドウにタブ コントロールがあります。
デフォルトでは、ウィンドウのサイズは、TabItems の内容に合わせてサイズ変更された TabControl に合わせてサイズ変更されます。これは望ましい動作です。1 つのタブのサイズを変更すると、すべてのタブがそのサイズになります。おそらくこれは、ウィンドウのサイズが変更されているためです。ただし、タブのサイズが変更されていない限り、ウィンドウがタブに合わせてサイズ変更されることが望ましい動作です。そのタブのサイズが変更された場合、そのサイズを記憶する必要があります。これを正しく実装できませんでした。通常、最初はサイズが変更されますが、タブを再度設定してサイズを変更すると、ウィンドウのみがサイズ変更され、タブは変更されないように見えます。
さらに、TabItems のコントロールは動的に作成され、常に同じサイズになるとは限らないため、サイズをハードコーディングすることはできません。これらの一部は WPF であり、一部は WindowsFormHost の WinForms コントロールです。これらは約 12 個ありますが、サンプル コードでは 3 個だけを使用しています。1 つはスクロール ビューアにあります。
<Window....
SizeToContent="WidthAndHeight" ResizeMode="CanResize">
<Grid>
<TabControl x:Name="tabControl" SizeChanged="tabControl_SizeChanged">
<TabItem x:Name="tabItem1" Selector.Selected="tabParams_Selected">
<Grid>
<ScrollViewer MaxHeight="1000">
<DynamicWpfcontrol/>
</ScrollViewer>
</Grid>
</TabItem>
<TabItem x:Name="tabItem2" Selector.Selected="tabRepresentations_Selected">
<Grid>
<WindowsFormsHost Margin="3">
<my:DynamicWinformControl AutoScroll="True" AutoSize="True" AutoSizeMode="GrowAndShrink"/>
</WindowsFormsHost>
</Grid>
</TabItem>
<TabItem x:Name="tabItem3" Selector.Selected="tabAttributes_Selected">
<Grid>
<WindowsFormsHost Margin="3">
<DynamicWinformControl AutoScroll="True" AutoSize="True" AutoSizeMode="GrowAndShrink"/>
</WindowsFormsHost>
</Grid>
</TabItem>
</TabControl>
</Grid>
private Size tab1Size;
private Size tab2Size;
private Size tab3Size;
private void tabControl_SizeChanged(object sender, SizeChangedEventArgs e)
{
if (tabItem1.IsSelected)
tab1Size = e.NewSize;
else if (tabItem2.IsSelected)
tab2Size = e.NewSize;
else if (tabItem1.IsSelected)
tab3Size = e.NewSize;
}
編集 - 幅と高さを設定する代わりに、Measure と UpdateLayout を使用するように tabItemSelected イベントを更新しました。メジャーが希望のサイズを設定することを理解しています。これは現在、幅を記憶するために機能していますが、高さはまだコンテンツの高さに戻されています。
private void tabItem1_Selected(object sender, RoutedEventArgs e)
{
if (tab1Size != Size.Empty && !(tab1Size.Height == 0 && tab1Size.Width == 0))
{
tabControl.Measure(tab1Size);
tabControl.Arrange(new Rect(tab1Size));
}
this.SizeToContent = System.Windows.SizeToContent.WidthAndHeight;
}