使 TabControl 宽度等于最大 TabItems 宽度和高度

Make TabControl Width equal to Max TabItems Width and Height

我有一个TabControl,里面有很多TabItems。 我试图使 TabControl's width 等于其 TabItems Width 的最大值(与高度相同)。 我不能明确地设置它,因为我的程序是多语言的,所以根据选择的语言,我需要不同宽度的所有标签(它们都在 "auto")。

有没有办法只在 XAML 中做?

编辑:

我找到了部分解决方案以便在代码中执行此操作:当我打开 window 我执行以下操作时:

List<TabItem> list = new List<TabItem>();
list.AddRange(tabControl.Items.OfType<TabItem>());
foreach (TabItem tabItem in list)
{
    tabControl.SelectedItem=tabItem;
    tabControl.UpdateLayout();
    tabItem.UpdateLayout();
    System.Threading.Thread.Sleep(250);
    maxWidth = Math.Max(maxWidth, tabItem.ActualWidth);
    maxHeight = Math.Max(maxHeight, tabItem.ActualHeight);
}
tabControl.Width = maxWidth;
tabControl.Height = maxHeight;

这似乎是一个可行的解决方案,但我不明白为什么 tabItem.ActualWidthtabItem.ActualHeight 总是设置为 0?

为了更好地理解,我放了一张我的 window 的屏幕截图:

当我打开我的 window 时,我已经知道它可以用哪种语言打开,所以 TabItems 尺寸在 windows 加载后不会改变。

编辑 2:

我的具体意思是“TabItems 的大小因使用的语言而异,这不是最好的例子,因为这里的差异很小,但我想将其应用于我项目的所有 TabContols 以确保我如果我以后进行更改,甚至添加其他语言,都不会遇到问题:

俄语:

英语:

我终于找到了一个解决方案,也许不是最好的,但它工作得很好,而且没有找到任何其他解决方案。 初始化 window 时无法完成这项工作,因为内容尚未加载 (MyWindow.Show()),所以我不得不使用 TabControl.[=15= 的 SizeChanged 事件]

在我的 ViewModel 上,我设置了两个参数 TabControlWidthTabControlHeight

private double tabControlWidth = 0;
public double TabControlWidth
{
    get { return tabControlWidth; }
    set
    {
        if (this.tabControlWidth != value)
        {
            tabControlWidth = value;
            this.NotifyPropertyChanged("TabControlWidth");
        }
    }
}
private double tabControlHeight = 0;
public double TabControlHeight
{
    get { return tabControlHeight; }
    set
    {
        if (this.tabControlHeight != value)
        {
            tabControlHeight = value;
            this.NotifyPropertyChanged("TabControlHeight");
        }
    }
}

在我的文件 MyWindow.xaml.cs 中,我添加了一个 bool 属性 来检查我何时检查了所有 TabItems(显然,这个 属性 在初始化 window 时设置为 false ) :

bool allTabItemsChecked { get; set; }

最后,我需要向我的 TabControl 添加两件事:

  • 将宽度和高度绑定到我在 ViewModel 中的属性。

  • 添加事件 SizeChanged

    SizeChanged="TabControlSizeChanged" MinHeight="{Binding TabControlHeight}" MinWidth="{Binding TabControlWidth}"

(不好意思,我没有把最后一行显示为代码?经常发生在我使用“-”或“*”之后)

最后我将 SizeChanged 函数设置为如下:

private void TabControlSizeChanged(object sender, SizeChangedEventArgs e)
{
    if(this.allTabItemsChecked==false)
    {
        int index = tabControl.SelectedIndex;
        List<TabItem> list = new List<TabItem>();
        list.AddRange(tabControl.Items.OfType<TabItem>());
        if (index < list.Count()-1)
        {
            tabControl.SelectedIndex = index + 1;
        }
        else
        {
            this.allTabItemsChecked = true;
            tabControl.SelectedIndex = 0;
        }
        contexte.TabControlWidth = Math.Max(tabControl.ActualWidth, contexte.TabControlWidth);
        contexte.TabControlHeight = Math.Max(tabControl.ActualHeight, contexte.TabControlHeight);

    }
}

当我们显示window时,事件自动启动。 然后,我会将 TabControl.SelectedIndex 更改为下一个 TabItem,并将 TabControl 尺寸更新为更大的尺寸。 当我到达最后一个索引时,我只是将 SelectedIndex 设置为 0,然后将 allTabItemsChecked 设置为 true。