具有固定高度的WPF TabControl

时间:2014-04-26 19:30:07

标签: c# wpf tabcontrol

我正在尝试创建一个使用TabControl分页的通用对话框。该对话框具有SizeToContent =“true”,因此该对话框没有未使用的空格。 TabControl使用ItemsSource设置模型中的页面内容,使用ContentTemplateSelector选择页面布局。

我遇到的问题是SizeToContent效果导致每次TabControl.SelectedItem发生更改时对话框都会调整大小,而我希望对话框使用最大TabItem中的内容调整大小。

我尝试过使用SharedSizeGroup选项,但这不起作用。我认为这是因为带有ItemsSource和ContentTemplateSelector的TabControl将仅加载选定的选项卡并丢弃其余选项卡,因此一次只能实例化一个SharedSizeGroup元素。

This article提供了另一个解决方案,其中每个TabItem都被测量但是这个解决方案对我不起作用,因为我正在使用ItemsSource并且读取Items集合返回我的模型对象而不是TabItems。

如果有人能为此提供解决方案,我将非常感激。

2 个答案:

答案 0 :(得分:1)

Sphinxxx,

感谢您的答案解决了确保在运行时创建所有选项卡的问题。但是,这并没有解决将tabcontrol的大小调整为最大内容的问题。事实上,使用SharedSizeGroup的以下代码甚至不起作用,因为窗口的SizeToContent似乎覆盖了网格大小:

<Window x:Class="TestTabControl.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" SizeToContent="Height">
<Grid>
<TabControl Grid.IsSharedSizeScope="True">
  <TabItem Header="Tab 1">
    <Grid >
      <Grid.RowDefinitions>
        <RowDefinition SharedSizeGroup="xxx"/>
      </Grid.RowDefinitions>
      <TextBlock Text="dhuehdiueh dhuehdiueh dhuehdiueh dhuehdiueh dhuehdiueh dhuehdiueh " TextWrapping="Wrap"/>
    </Grid>
  </TabItem>
  <TabItem Header="Tab 2">
    <Grid >
      <Grid.RowDefinitions>
        <RowDefinition SharedSizeGroup="xxx"/>
      </Grid.RowDefinitions>
      <TextBlock Text="ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi ieiureijdi " TextWrapping="Wrap"/>
    </Grid>
  </TabItem>
    </TabControl>

我认为最终解决方案(我还在努力)是使用链接中提供的解决方案之一在运行时创建所有选项卡,并结合一些代码来测量加载后每个选项卡的内容。像这样:

private void LoadedTabControl_Loaded(object sender, RoutedEventArgs e)
{
  double contentWidth = ((FrameworkElement)((TabItem)tabCtrl.SelectedItem).Content).ActualWidth;

  double max = 0;
  foreach (TabItem tab in tabCtrl.Items)
  {
    ((FrameworkElement)tab.Content).Measure(new Size(contentWidth, double.PositiveInfinity));
    max = Math.Max(((FrameworkElement)tab.Content).DesiredSize.Height, max);
  }
  foreach (TabItem tab in tabCtrl.Items)
  {
    ((FrameworkElement)tab.Content).Height = max;
  }
}

答案 1 :(得分:0)

是的,在您的情况下,TabControl一次只为一个项目(SelectedItem)创建UI。此CodeProject文章提供了一些解决方法的链接,并建议了自己的解决方案:

WPF TabControl: Turning Off Tab Virtualization