Сделайте ширину TabControl равной максимальной ширине и высоте TabItems - PullRequest
2 голосов
/ 28 июня 2019

У меня есть TabControl со многими TabItems внутри. Я пытаюсь сделать TabControl's width равным Max его TabItems Width (то же самое для высоты). Я не могу установить его явно, потому что моя программа мультиязычна, и поэтому, в зависимости от выбранного языка, мне нужны разные ширины для всех моих меток (все они в «auto»).

Есть ли способ сделать только в 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?

Чтобы лучше понять, я поставил скриншот моего окна:

options

Когда я открываю свое окно, я уже знаю, на каком языке оно может быть открыто, поэтому размеры TabItems не меняются после загрузки окон.

Редактировать 2:

Вот конкретно то, что я имею в виду под "размером TabItems в зависимости от используемого языка, это не лучший пример, так как здесь разница невелика, но я хотел бы применить это ко всем TabContols моего проекта, чтобы быть уверенным, что я никогда не встречал" проблема, если я внесу изменения в будущем или даже добавлю другие языки:

На русском языке:

enter image description here

На английском:

enter image description here

1 Ответ

0 голосов
/ 28 июня 2019

Я наконец нашел решение, может быть, не самое лучшее, но оно работает отлично, и не нашел другого решения.Невозможно выполнить эту работу при инициализации окна, так как содержимое еще не было загружено (MyWindow.Show ()), поэтому мне пришлось использовать событие SizeChanged в TabControl.

В моем ViewModel Iустановить два параметра 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);

    }
}

Когда мы отображаем окно, событие автоматическиLy запущен.Затем я изменю TabControl.SelectedIndex на следующий TabItem и обновлю размеры TabControl на большее.Когда я достиг последнего индекса, я просто установил SelectedIndex на 0, а затем установил для allTabItemsChecked значение true.

...