记住调整选项卡大小的选项卡大小

时间:2013-06-24 08:34:23

标签: c# wpf tabcontrol tabitem

我在一个窗口中有一个标签控件,上面有几个标签。

默认情况下,窗口大小会在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;

}

0 个答案:

没有答案