WPF Tabcontrol 占用最大选项卡的大小

Posted

技术标签:

【中文标题】WPF Tabcontrol 占用最大选项卡的大小【英文标题】:WPF Tabcontrol take size of largest tab 【发布时间】:2015-09-24 21:42:12 【问题描述】:

我有一个绑定到 Viewmodels 集合的 TabControl,这些 Viewmodels 会被翻译成适合绘制到选项卡中的内容:

<Window.Resources>
    <ResourceDictionary>
        <DataTemplate DataType="x:Type charting:LineFormatViewModel">
            <charting:LineFormatView />
        </DataTemplate>
        <DataTemplate DataType="x:Type charting:IndexSettingsViewModel">
            <charting:IndexSettingsView />
        </DataTemplate>
        ....
    </ResourceDictionary>
</Window.Resources>

<TabControl ItemSource="Binding ViewModels" />

我一直在尝试找到一种方法,始终以任何子项的最大宽度和高度绘制 TabControl。 Let WPF Tabcontrol height assume height of largest item? 在答案中提到了实现这一目标的几种方法(据我所知):

将 Grid 与 SharedSizeGroup 一起使用 - 似乎需要在 TabControl 的实际内容上应用 DataTemplate,这会覆盖 VM 实现的自动视图绘制 ->在资源字典中创建的视图映射 使用宽度/高度转换器,这需要我的 TabControl 绑定到 UI 元素集合而不是视图模型

有人有解决类似问题的经验吗?每次我在这方面取得一些进展时,我似乎都会遇到更多障碍。

【问题讨论】:

This answer 可能在正确的轨道上。我认为您需要使用 ItemsContainerGenerator 为 ItemsSource 中的每个元素生成 UI 项目,并确定该项目的大小(可能使用 this answer 中的代码?)以确定最大大小是多少。 @zepee,你找到解决办法了吗? 【参考方案1】:

您需要使用可以自动适应的命名隐藏控件,并且 创建直接绑定到它们的宽度/高度,例如:

 Width="Binding ActualWidth, ElementName=MainGrid"

【讨论】:

【参考方案2】:

如果其他人遇到这个问题,我在窗口的 ContentRendered 事件处理程序中使用以下代码解决了它:

tabControl.SelectedIndex = 1;
UpdateLayout();
SizeToContent = SizeToContent.Manual;
tabControl.SelectedIndex = 0;

tabsControl 是 TabControl 对象的名称。基本上我们所做的是切换到具有最大高度的选项卡(在我的示例中为索引 1),更新窗口的布局,告诉窗口停止调整大小以适应其内容,然后切换回第一个选项卡。当然,此解决方案假定您知道哪个选项卡的高度最大,并且您不需要在初始渲染后调整窗口大小以适应其内容。

【讨论】:

以上是关于WPF Tabcontrol 占用最大选项卡的大小的主要内容,如果未能解决你的问题,请参考以下文章

让 WPF Tabcontrol 高度假设最大项目的高度?

wpf 实现多个选项卡左右移动

TabControl WPF 问题中与 SelectedItem 的异步绑定

如何将 TabControl 的项目绑定到 wpf 中的可观察集合?

带有添加新选项卡按钮 (+) 的 TabControl

根据选项卡的数量自动调整选项卡标题的大小 (AvaloniaUI)