我在一个窗口中有一个选项卡控件,上面有几个选项卡。
默认情况下,窗口的大小围绕 TabControl 调整大小,该 TabControl 的大小与 TabItems 的内容一致。这是期望的行为。当调整一个选项卡的大小时,所有选项卡都会变为该大小。大概这是因为它是正在调整大小的窗口。但是,除非已调整该选项卡的大小,否则所需的行为是让窗口调整到选项卡的大小。如果该选项卡已调整大小,则需要记住其大小。我无法正确实现此功能,通常会首次调整大小,但是当标签再次设置为重新调整时,似乎只有窗口调整大小而不是选项卡。
此外,我无法对尺寸进行硬编码,因为 TabItems 上的控件是动态创建的,并且尺寸并不总是相同。其中一些是 WPF,一些是 WindowsFormHost 中的 WinForms 控件。其中大约有十几个,但在我的示例代码中只使用了 3 个。一个是在滚动查看器上。
<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;
}
编辑 - 我已更新 tabItemSelected 事件以使用 Measure 和 UpdateLayout 而不是设置宽度和高度。我了解该度量设置了所需的大小。这现在可以记住宽度,但高度仍被设置回内容的高度。
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;
}