Wpf TabControl宽度在添加选项卡时增加

Wpf TabControl宽度在添加选项卡时增加,wpf,.net-4.0,tabcontrol,scrollviewer,Wpf,.net 4.0,Tabcontrol,Scrollviewer,我的应用程序UI分为两部分。左侧是导航菜单,右侧是显示所选菜单内容的视图区域。现在,菜单之一是报告。我正在使用带有标题和内容模板的Tabcontrol。模板的ViewModel作为数据类型,content作为相应的视图,这是一个UserControl。此选项卡控件位于scrollviewer中,scrollviewer设置为水平和垂直对齐以进行拉伸 用户控件在网格内托管ContentPresenter,该网格绑定到ReportHost,ReportHost的子级为reportviewer。我正在

我的应用程序UI分为两部分。左侧是导航菜单,右侧是显示所选菜单内容的视图区域。现在,菜单之一是报告。我正在使用带有标题和内容模板的Tabcontrol。模板的ViewModel作为数据类型,content作为相应的视图,这是一个UserControl。此选项卡控件位于scrollviewer中,scrollviewer设置为水平和垂直对齐以进行拉伸

用户控件在网格内托管ContentPresenter,该网格绑定到ReportHost,ReportHost的子级为reportviewer。我正在使用此ReportViewer生成报告

当用户打开报告时,它将在新选项卡中打开。它可以正常工作,直到选项卡的数量达到将选项卡标题包含在查看区域内为止。但一旦添加更多选项卡,就会导致tabcontrol宽度拉伸,导致选项卡的内容区域拉伸,contentpresenter也会拉伸,从而出现水平滚动。 这最终导致报告被拉伸,并且由于某种原因(我不知道),报告与UI的导航区域重叠,好像它不是UI的一部分,而是与UI重叠。整个报告在视图区域和滚动导航菜单的顶部保持浮动

我可以通过向ScrollViewer提供MaxWidth来修复它,但我不想这样做。我想tabcontroll或Scrolviewer的宽度完全取决于可用的视图面积。如何在不使用固定宽度的情况下通过代码或XAML实现这一点

我不确定我是否能够解释这种情况。如果需要更多信息或澄清,请告诉我。我非常乐意提供细节

编辑:为信息添加代码

<DataTemplate x:Key="TabContent" DataType="{x:Type VM:ReportViewModel}">
  <View:Report/>
</DataTemplate>
<DataTemplate x:Key="TabHeader" DataType="{x:Type VM:ReportViewModel}">
  <ContentPresenter Content="{Binding Path=TabHeader}"
    VerticalAlignment="Center"/>
</DataTemplate>

<ScrollViewer HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
    HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
  <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="*"/>
    <RowDefinition Height="Auto"/>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>
    <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap"
        Text="Reports" VerticalAlignment="Top" Margin="10,13,0,0" 
        FontSize="18.667" FontFamily="Segoe UI" Foreground="White"/>
    <Border BorderThickness="0" Margin="0,50,0,0" 
        Background="{DynamicResource Brush_HeaderNew}" Height="50" Width="Auto" 
        VerticalAlignment="Top"/>
    <TabControl ItemsSource="{Binding ReportItems}" Grid.Row="1" Margin="0,20,0,0" 
        SelectedItem="{Binding SelectedReportItem}"
        ContentTemplate="{StaticResource TabContent}" 
        ItemTemplate="{StaticResource TabHeader}"
    />
  </Grid>
</ScrollViewer>

ScrollViewer
为其子代提供了一个无限大的区域,可以在该区域上进行自我设置,因为它的原因是,如果滚动空间大于ScrollViewer本身的可用空间,它可以提供滚动。因为您的控件在两个方向都启用了滚动,这意味着
TabControl
可以在两个方向上任意扩展,而且它不会聪明到知道它在
ScrollViewer
中,并且您希望选项卡不利用这个虚拟空间


从事物的声音中,你可能想考虑在<代码> TabMeung中移动<代码> ScrollViewer <代码>,以便只有标签的内容是可滚动的而不是整个集合。您应该可以通过修改选项卡内容模板来实现这一点。

哇,这很有效。唯一的问题是,当制表符更多时,制表符标题显示在多行中。但我想我可以接受。非常感谢。如果需要,您可以修复此问题,但这涉及到更改
TabControl
的模板,而且有点复杂。网络上有很多文章会带你去做一个有滚动标签或其他一些替代品,而不是生成多行的。我会尝试找出答案,但如果你有一个链接到相同的实现,如果你能与我分享,我会很高兴。这篇文章对我了解如何处理
TabControl
非常有帮助,它涵盖了滚动选项卡栏以及广泛的视觉定制。