我在一个窗口中有一个标签控件,上面有几个标签。
默认情况下,窗口大小会在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;
}