遗憾的是没有TabControl.SelectionChanging事件(Selector.SelectionChanging),我正在努力实现这种行为,所以我可以取消更改请求。
我尝试将TabControl.Items.CurrentChanging
(Items
属性和ItemCollection
)事件设置e.Cancel(CurrentChangingEventArgs
)设置为true,但UI是虽然该集合中的项目未更改,但使用新选项卡进行了更新。
当条件不满意时,有没有办法阻止用户切换到不同的TabItem
?
答案 0 :(得分:5)
我不知道发生这种情况的确切原因,这让我非常恼火。
但这是我的解决方法:
在下面的示例中,复选框是“锁定”当前选项卡。所以检查意味着用户无法更改标签。
void Items_CurrentChanging(object sender, CurrentChangingEventArgs e)
{
if (checkBox1.IsChecked.Value)
{
var item = ((ICollectionView)sender).CurrentItem;
e.Cancel = true;
tabControl1.SelectedItem = item;
}
}
基本上,发生的事情是(如果我理解正确的话)可视树会更新,但逻辑树却没有。上述方式强制视觉与逻辑树同步。
答案 1 :(得分:0)
您还可以处理每个PreviewLostKeyboardFocus上的TabItem事件,并将事件参数的Handled属性设置为true
,以防止切换到另一个标签:
protected void tabItem_PreviewLostKeyboardFocus(object sender,
KeyboardFocusChangedEventArgs e)
{
if (!ValidateTabItem((TabItem) sender)) {
e.Handled = true;
}
}