【问题标题】:WPF TabControl On SelectionChanged, set focus to a text fieldWPF TabControl On SelectionChanged,将焦点设置到文本字段
【发布时间】:2010-10-19 17:50:02
【问题描述】:

我有一个选项卡控件和一些选项卡项。我正在成功收听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 内容有关,但我不确定如何修复它。

【问题讨论】:

  • 您是否已将问题隔离到代码外部以查看它是否可重现?如果是这样,这是一个时间/框架问题,然后您可以利用掌握的知识以不同的方式解决问题。
  • 我能够在存根程序中不一致地重现它。

标签: c# wpf focus tabs selectionchanged


【解决方案1】:

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

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

【讨论】:

  • 我没有遇到线程异常,但这已经解决了问题。谢谢。
  • 是的,在这种情况下,它与线程无关。一些控件在内部使用 Dispatcher.Invoke/BeginInvoke。通过将您的任务添加到 Dispatcher 队列的末尾,您允许它之前的所有内容完成(只要您的任务与其他所有任务的优先级相同或更低)。至少这是我的理解。
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-21
相关资源
最近更新 更多