C# WPF选项卡控件在选择更改时,将焦点设置为文本字段

C# WPF选项卡控件在选择更改时,将焦点设置为文本字段,c#,wpf,focus,tabs,selectionchanged,C#,Wpf,Focus,Tabs,Selectionchanged,我有一个选项卡控件和一些选项卡项。我正在成功地收听SelectionChanged事件,并检查我感兴趣的选项卡是否是当前选定的选项卡 我正在使用这段代码(如下),通过调试程序,我可以看到我的分支逻辑按设计工作;但是,我遇到的问题是,有东西正在覆盖对txt.Focus()的调用,因为在显示正确的选项卡项后,焦点不在文本框上 private void tabMain_SelectionChanged(object sender, SelectionChangedEventArgs e) {

我有一个选项卡控件和一些选项卡项。我正在成功地收听
SelectionChanged
事件,并检查我感兴趣的选项卡是否是当前选定的选项卡

我正在使用这段代码(如下),通过调试程序,我可以看到我的分支逻辑按设计工作;但是,我遇到的问题是,有东西正在覆盖对
txt.Focus()
的调用,因为在显示正确的选项卡项后,焦点不在文本框上

private void tabMain_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    // exact same behavior with and without this line
    e.Handled = true;

    if (e.AddedItems.Contains(usrTab))
    {
        txtusr.Focus();
    }
    else if (e.AddedItems.Contains(svcTab))
    {
        txtsvc.Focus();
    }
}
如果我只是将
txtusr.Focus()
放在按钮事件处理程序中,它的焦点与我预期的完全一致

我怀疑这与调用
.Focus()
方法时没有加载tabitem内容有关,但我不确定如何着手修复它。

尝试将.Focus()调用放入dispatcher.BeginInvoke中

Dispatcher.BeginInvoke(new Action(() => { txtsvc.Focus(); }));

您是否已将问题隔离在代码外部,以查看其是否可复制?如果是这样的话,这是一个时间/框架问题,然后你可以用手头的知识稍微不同地处理这个问题。我能够在存根程序中不一致地重现这个问题。我没有遇到线程异常,但这已经解决了这个问题。谢谢。是的,在这种情况下,它不是关于线程的。某些控件在内部使用Dispatcher.Invoke/BeginInvoke。通过将任务添加到Dispatcher队列的末尾,可以让它完成之前的所有任务(只要任务的优先级与其他任务相同或更低)。这至少是我的理解。