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

时间:2019-06-28 15:05:04

标签: c# wpf tabcontrol

我有一个TabControl,里面有很多TabItems。 我正在尝试使TabControl's width等于其TabItems Width的最大值(高度相同)。 我不能显式设置它,因为我的程序是多语言的,所以根据选择的语言,我需要为所有标签设置不同的宽度(它们都在“自动”位置)。

是否只有XAML可以做到?

编辑:

我在代码中找到了解决方案的一部分:打开窗口时,请执行以下操作:

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?

为了更好地理解,我在窗口上放了一个屏幕截图:

options

打开窗口时,我已经知道可以使用哪种语言打开窗口,因此在加载窗口后TabItems尺寸不会改变。

编辑2:

具体来说,这是“ TabItem的大小因所用语言而异,这不是最佳示例,因为此处的差别很小,但我想将其应用于我项目的所有TabContols中,以确保我从未见过问题,如果我将来进行更改,甚至添加其他语言:

俄语:

enter image description here

英语:

enter image description here

1 个答案:

答案 0 :(得分:0)

我终于找到了一个解决方案,也许不是最好的,但是它运行良好,并且没有找到其他解决方案。 初始化窗口时无法执行此操作,因为尚未加载内容(MyWindow.Show()),因此我不得不使用TabControl的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(显然,初始化窗口时此属性设置为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);

    }
}

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

相关问题