2010-11-16 26 views
5

Maalesef, TabControl.SelectionChanging olayı yok (Selector.SelectionChanging), bu davranışı uygulamak için mücadele ediyorum, böylece değişen isteği iptal edebilirim. TabControl.Items.CurrentChanging işlemini iptal etmenin bir yolu var mı?

Ben e.Cancel ( CurrentChangingEventArgs arasında) doğru olarak ayarlanması TabControl.Items.CurrentChanging ( Items özelliktir ve ItemCollection) olayını işlemek için çalıştı, ama öğe koleksiyonunda değişmez rağmen UI yeni sekmede ile güncellenir edilir .

Bir koşuldan memnun kalmadığında, kullanıcının farklı bir TabItem değiştirmesini engellemenin bir yolu var mı?

cevap

5

Bunun nedenini tam olarak bilmiyorum ve bu beni çok rahatsız ediyor.

Ama burada bunun için benim geçici çözüm var: Aşağıdaki örnekte

, onay kutusu Geçerli sekmeyi "kilitleme" dır. Bu nedenle işaretliyse, kullanıcı sekmeyi değiştiremez.

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

     e.Cancel = true; 

     tabControl1.SelectedItem = item; 
    } 
} 

Temel olarak, ne olur (bunu doğru anlarsam) görsel ağaç güncelleştirilir, ancak mantıksal ağaç yok. Yukarıdaki yol görselin mantıksal ağaç ile senkronize olmasını zorlar.

+0

İyi yakalama. teşekkür ederim. – Shimmy

0

Ayrıca her TabItem üzerinde PreviewLostKeyboardFocus olay işlemek ve başka bir sekmeye geçiş önlemek için true etkinlik argümanlardan Handled özelliğini ayarlayabilirsiniz:

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 bakınız.