2010-11-16 55 views
5

Desafortunadamente no hay evento TabControl.SelectionChanging (SelectorCSelección de cambios), estoy luchando para implementar este comportamiento, así que puedo cancelar la solicitud de cambio.¿Hay alguna forma de cancelar TabControl.Items.CurrentChanging?

Me trataron de controlar el evento TabControl.Items.CurrentChanging (la propiedad es Items y ItemCollection) establecer e.Cancel (del CurrentChangingEventArgs) de verdad, pero la interfaz de usuario se se actualiza con la nueva pestaña aunque el artículo no se cambia en la colección .

¿Hay alguna forma de evitar que el usuario cambie a un TabItem diferente cuando una condición no está satisfecha?

Respuesta

5

No sé la razón exacta de por qué sucede esto, y me molesta mucho.

Pero aquí está mi solución para ello:

En el ejemplo siguiente, se casilla de verificación "Bloqueo" en la pestaña actual. Así que revisado significa que el usuario no puede cambiar la pestaña.

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

     e.Cancel = true; 

     tabControl1.SelectedItem = item; 
    } 
} 

Básicamente, lo que sucede es (si entiendo esto correctamente) el árbol visual se actualiza, pero el árbol lógico no lo hace. La forma anterior obliga a que el visual se sincronice con el árbol lógico.

+0

Buena captura. gracias. – Shimmy

0

También puede controlar el evento PreviewLostKeyboardFocus en cada TabItem, y establezca la propiedad Handled de los argumentos del evento a true para evitar el cambio a otra ficha:

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

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

Cuestiones relacionadas