为什么在我设置SelectedIndex = 0后,我是否随后(不响应)获取用SelectedIndex = 4调用的事件处理程序?我将其追溯到Dispatcher的调用,但我不明白为什么。
这是计划:我有一个页面,其中包含带有各种标签的标签控件。当我点击某些类型的标签时,我想将此页面切换到另一个页面。麻烦的是,当我回到这个页面时,我又回到了另一个页面,我无法弄清楚原因。
具体来说,我设置SelectedIndex = 0,然后[外部代码]将SelectedIndex更改为4,导致页面再次被切换。
//在JobTreePage.xaml
中<TabControl x:Name="mainTab"
ItemsSource="{Binding}"
SelectionChanged="mainTab_SelectionChanged">
//在JobTreePage
中private void mainTab_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
e.Handled = true;
if (!ready) return;
var ee = this.TryFindResource("Title");
TabItem x = mainTab.SelectedItem as TabItem;
if (x == null) return;
if (IsJobTab(x)) // index 4 is a job tab
{
if (ready ) // assuming the job selected is 1273.
{
ResetTab();
//mainTab.SelectedItem = AddNew;
mw.moldDataButton_Click(sender, e);
}
ready = true;
}
}
public void ResetTab()
{
ready = false;
Application.Current.Dispatcher.BeginInvoke
((Action)delegate { mainTab.SelectedIndex = 0; }, DispatcherPriority.Send, null);
//mainTab.SelectedIndex = 0;
ready = true;
}
在MainWindow中我有两个按钮:
public void moldDataButton_Click(object sender, RoutedEventArgs e)
{
CurrentPage = this.moldDataPage;
moldDataPage.ActivateTab("Project");
// the problem line. problem arises after I click on the Customers button.
Dispatcher.Invoke(new System.Action(() => { }), DispatcherPriority.ContextIdle, null);
Slow_COM_Operation();
}
private void CustomersButton_Click(object sender, RoutedEventArgs e)
{
this.jobTreePage.ResetTab();
CurrentPage = this.jobTreePage;
}
所以从CustomersButton_Click(),ResetTab,SelectedIndex == 0跟踪程序,但在那之后我们跳转到mainTab_SelectionChanged并看到SelectedIndex == 4.我不知道是什么强迫SelectedIndex为4。
旁白:为什么我有这个调度员线?因为我尝试通过COM互操作发送异步请求以在没有对话框冻结的情况下发生其他一些事情。我不知道如何实现这个目标,但是至少可以让我更新页面。