2010-11-16 10 views
5

Niestety nie ma zdarzenia TabControl.SelectionChanging (Selector.SelectionChanging), próbuję zaimplementować to zachowanie, aby anulować zmianę żądania.Czy istnieje sposób, aby anulować TabControl.Items.CurrentChanging?

Próbowałem obsłużyć TabControl.Items.CurrentChanging (właściwość Items jest i ItemCollection) Wydarzenie ustawienia e.Cancel (z CurrentChangingEventArgs) true, ale interfejs użytkownika jest się na bieżąco z nowej karcie chociaż pozycja nie zmienia się w zbiorach .

Czy istnieje sposób, aby uniemożliwić użytkownikowi zmianę na inny TabItem, gdy warunek jest niezadowolony?

Odpowiedz

5

Nie znam dokładnego powodu, dla którego tak się dzieje, i bardzo mnie to irytuje.

Ale tu jest mój obejście go:

W poniższym przykładzie, pole wyboru jest „blokowania” bieżącą kartę. Oznacza to, że użytkownik nie może zmienić karty.

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

     e.Cancel = true; 

     tabControl1.SelectedItem = item; 
    } 
} 

Zasadniczo to, co się dzieje, to (jeśli rozumiem to poprawnie), że drzewo wizualne zostanie zaktualizowane, ale drzewo logiczne nie. Powyższy sposób wymusza synchronizację wizualną z drzewem logicznym.

+0

Dobry połów. Dziękuję Ci. – Shimmy

0

Można również obsługiwać zdarzenia PreviewLostKeyboardFocus na każdym TabItem i ustawić właściwość argumentów zdarzeń Handled do true aby zapobiec przejściu na inną kartę:

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

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