Есть ли способ отменить TabControl.Items.CurrentChanging?

К сожалению, нет события TabControl.SelectionChanging (Selector.SelectionChanging), я изо всех сил пытаюсь реализовать это поведение, чтобы отменить запрос на изменение.

Я попытался обработать событие TabControl.Items.CurrentChanging (свойство Items и ItemCollection), установив для события e.Cancel (из CurrentChangingEventArgs) значение true, но пользовательский интерфейс обновляется новой вкладкой, хотя элемент не изменяется в коллекции.

Есть ли способ запретить пользователю переключаться на другой TabItem, когда условие не выполняется?


person Shimmy Weitzhandler    schedule 16.11.2010    source источник


Ответы (2)


Я не знаю точной причины, почему это происходит, и это меня очень раздражает.

Но вот мой обходной путь для этого:

В примере ниже флажок «блокирует» текущую вкладку. Таким образом, отмеченный флажок означает, что пользователь не может изменить вкладку.

void Items_CurrentChanging(object sender, CurrentChangingEventArgs e)
{
    if (checkBox1.IsChecked.Value)
    {
        var item = ((ICollectionView)sender).CurrentItem;

        e.Cancel = true;

        tabControl1.SelectedItem = item;
    }
}

По сути, происходит следующее (если я правильно понимаю) визуальное дерево обновляется, а логическое дерево — нет. Приведенный выше способ заставляет визуал синхронизироваться с логическим деревом.

person ThomasAndersson    schedule 16.11.2010
comment
Примечание: мне также приходилось вручную устанавливать новую вкладку, если я не отменял событие. Не знаю почему, но иначе вкладка не изменилась бы. - person mennowo; 11.02.2021

Вы также можете обработать событие PreviewLostKeyboardFocus на каждом TabItem и установите Обрабатывается свойство аргументов события для true, чтобы предотвратить переключение на другое вкладка:

protected void tabItem_PreviewLostKeyboardFocus(object sender,
    KeyboardFocusChangedEventArgs e)
{
    if (!ValidateTabItem((TabItem) sender)) {
        e.Handled = true;
    }
}

См. http://www.netframeworkdev.com/windows-presentation-foundation-wpf/how-to-cancel-navigation-between-tabitems-in-a-tabcontrol-84994.shtml.

person Frédéric Hamidi    schedule 16.11.2010