0

我在一个窗口中有一个选项卡控件,上面有几个选项卡。

默认情况下,窗口的大小围绕 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;

}
4

0 回答 0