繁体   English   中英

具有固定高度的WPF TabControl

[英]WPF TabControl with a fixed height

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

我遇到的问题是SizeToContent效果导致每次TabControl.SelectedItem更改时对话框都会重新调整大小,而我宁愿对话框使用最大TabItem中的内容来调整自身大小。

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

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

如果有人可以提供解决方案,我将不胜感激。

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;
  }
}

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

WPF TabControl:关闭选项卡虚拟化

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM