You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF自定义DatePicker中MoveFocus焦点跳转异常问题求助

问题原因与解决方案

核心错误点

你当前调用的是UserControl的MoveFocus方法,而非触发事件的TextBox本身的MoveFocus,导致焦点导航的起点是整个UserControl而非当前输入框,这才会出现焦点跳回第一个TextBox的异常。此外,默认的TraversalRequest允许循环跳转(最后一个控件跳回第一个),也可能加剧这个问题。

具体修复步骤

  1. 修正焦点跳转的调用对象
    将焦点跳转逻辑中的MoveFocus(req)改为textBox.MoveFocus(req),让焦点从当前输入的TextBox开始向后导航。

  2. 禁用循环跳转
    创建TraversalRequest时设置Wrapped = false,避免最后一个TextBox输入完成后跳回第一个。

  3. 确保事件注册/注销逻辑正确
    你的_UnregisterEvents()和_RegisterEvents()需要正确解绑/绑定TextChanged事件,防止修改InputText时重复触发事件干扰焦点逻辑。

修改后的焦点跳转代码片段

//jump between textboxes
if ((tagText == "d" || tagText == "M") && textBox.InputText.Length == 2)
{
    TraversalRequest req = new TraversalRequest(FocusNavigationDirection.Next)
    {
        Wrapped = false // 禁止循环跳转
    };
    textBox.MoveFocus(req); // 从当前TextBox发起导航
}
else if (tagText == "yyyy" && textBox.InputText.Length == 4)
{
    TraversalRequest req = new TraversalRequest(FocusNavigationDirection.Next)
    {
        Wrapped = false
    };
    textBox.MoveFocus(req);
}

额外检查项

  • 确认三个TextBox的TabIndex按输入顺序设置(比如根据CultureInfo的日期格式,日/月/年对应TabIndex 1/2/3)。
  • 将UserControl的KeyboardNavigation.TabNavigation属性设置为Local,确保内部控件的Tab导航独立于外部。
  • 验证EvolutionTextbox的InputText属性修改时是否会正确触发TextChanged,避免不必要的重复执行。

内容的提问来源于stack exchange,提问作者Yoji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:42:30