繁体   English   中英

使TabControl Width等于Max TabItems Width和Height

[英]Make TabControl Width equal to Max TabItems Width and Height

我有一个带有许多TabItemsTabControl 我试图使TabControl's width等于其TabItems Width (与Height相同)的Max。 我无法明确设置它,因为我的程序是多语言的,因此根据所选语言的不同,我需要为所有标签使用不同的宽度(它们都处于“自动”状态)。

有一种方法只能在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.ActualWidth解决方案,但我不明白为什么将tabItem.ActualWidthtabItem.ActualHeight始终设置为0?

为了更好地理解,我在窗口中添加了屏幕截图:

选项

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

编辑2:

具体来说,这就是我的意思,“ TabItems的大小在所使用的语言方面有所不同,这不是最佳示例,因为此处的差异很小,但是我想将其应用于我项目的所有TabContols以确保在以下情况下我从未遇到过问题:我将来会进行更改,甚至添加其他语言:

俄语:

在此处输入图片说明

用英语 :

在此处输入图片说明

我终于找到了一个解决方案,也许不是最好的,但是它运行良好,没有找到其他解决方案。 由于尚未加载内容(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中添加两件事:

  • 将Width和Height绑定到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。

暂无
暂无

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

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