使 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.ActualWidth
和 tabItem.ActualHeight
总是设置为 0?
为了更好地理解,我放了一张我的 window 的屏幕截图:
当我打开我的 window 时,我已经知道它可以用哪种语言打开,所以 TabItems 尺寸在 windows 加载后不会改变。
编辑 2:
我的具体意思是“TabItems 的大小因使用的语言而异,这不是最好的例子,因为这里的差异很小,但我想将其应用于我项目的所有 TabContols 以确保我如果我以后进行更改,甚至添加其他语言,都不会遇到问题:
俄语:
英语:
我终于找到了一个解决方案,也许不是最好的,但它工作得很好,而且没有找到任何其他解决方案。
初始化 window 时无法完成这项工作,因为内容尚未加载 (MyWindow.Show()),所以我不得不使用 TabControl.[=15= 的 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(显然,这个 属性 在初始化 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。
我有一个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.ActualWidth
和 tabItem.ActualHeight
总是设置为 0?
为了更好地理解,我放了一张我的 window 的屏幕截图:
当我打开我的 window 时,我已经知道它可以用哪种语言打开,所以 TabItems 尺寸在 windows 加载后不会改变。
编辑 2:
我的具体意思是“TabItems 的大小因使用的语言而异,这不是最好的例子,因为这里的差异很小,但我想将其应用于我项目的所有 TabContols 以确保我如果我以后进行更改,甚至添加其他语言,都不会遇到问题:
俄语:
英语:
我终于找到了一个解决方案,也许不是最好的,但它工作得很好,而且没有找到任何其他解决方案。 初始化 window 时无法完成这项工作,因为内容尚未加载 (MyWindow.Show()),所以我不得不使用 TabControl.[=15= 的 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(显然,这个 属性 在初始化 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。