我有一个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.ActualWidth
和tabItem.ActualHeight
总是设置为0?
为了更好地理解,我在窗口上放了一个屏幕截图:
打开窗口时,我已经知道可以使用哪种语言打开窗口,因此在加载窗口后TabItems尺寸不会改变。
编辑2:
具体来说,这是“ TabItem的大小因所用语言而异,这不是最佳示例,因为此处的差别很小,但我想将其应用于我项目的所有TabContols中,以确保我从未见过问题,如果我将来进行更改,甚至添加其他语言:
俄语:
英语:
答案 0 :(得分:0)
我终于找到了一个解决方案,也许不是最好的,但是它运行良好,并且没有找到其他解决方案。 初始化窗口时无法执行此操作,因为尚未加载内容(MyWindow.Show()),因此我不得不使用TabControl的SizeChanged事件。
在ViewModel上,我设置了两个参数TabControlWidth
和TabControlHeight
。
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。