Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#当达到允许删除的文本框MaxLength时自动标记_C#_Wpf - Fatal编程技术网

C#当达到允许删除的文本框MaxLength时自动标记

C#当达到允许删除的文本框MaxLength时自动标记,c#,wpf,C#,Wpf,我用的是WPF 当达到“MaxLength”时,我想自动切换到下一个文本框。 我找到了这个代码: 它正在工作。但问题是,当达到最大长度时,我无法删除文本 我也不能更改实际文本。 您想让我修改或删除MaxLength文本框中的文本吗? 我的XAML: <TextBox Grid.Column="0" Name="txtC1" Margin="5" MaxLength="7" PreviewKeyDown="txt1_PreviewKeyDown"></TextBox> &l

我用的是WPF 当达到“MaxLength”时,我想自动切换到下一个文本框。
我找到了这个代码:
它正在工作。但问题是,当达到最大长度时,我无法删除文本
我也不能更改实际文本。
您想让我修改或删除MaxLength文本框中的文本吗?
我的XAML:

<TextBox Grid.Column="0" Name="txtC1" Margin="5" MaxLength="7" PreviewKeyDown="txt1_PreviewKeyDown"></TextBox>
<TextBox Grid.Column="1" Name="txt2" Margin="5" MaxLength="12" PreviewKeyDown="txt2_PreviewKeyDown"></TextBox>
<TextBox Grid.Column="2" Name="txt3" Margin="5" MaxLength="12" PreviewKeyDown="txt3_PreviewKeyDown"></TextBox>

问题是,您在按键时使用了事件,这意味着当按下backspace或delete时,会触发事件,但在按键事件完成之前,文本不会更改,因此,代码将始终在文本框中使用相同数量的字符进行验证,并且在文本框中再输入一个字符将触发您案例中的焦点更改

你可以这样做 XAML


您仍然可以为其他内容执行一些按键事件,例如:仅允许某些按键,如数字或特殊数字,但最好使用textChanged事件验证文本长度

我解决了自己的问题。由于我得到了不同的答案,我使用了一些。
这是我的新代码:

private void txt1_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        // Auto-tab when maxlength is reached
        if (((TextBox)sender).MaxLength == ((TextBox)sender).Text.Length)
        {
            if(e.Key != Key.Delete && e.Key != Key.Clear && e.Key != Key.Back && ((TextBox)sender).SelectionLength == 0)
            {
                // move focus
                var ue = e.OriginalSource as FrameworkElement;
                e.Handled = true;
                ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            } 

        }
    }

它正在工作

你能添加一些代码让我们看看你做了什么吗?谢谢,但和我发布的链接上的代码一样。我会在我这边做一个测试项目,但实际发生了什么?当文本达到最大长度时,您根本无法编辑内容?是的,因为在按下键时,它会自动转到下一个文本框。我正在筛选back或delete键,但我不知道每个删除键,我也不知道如何知道文本框中是否选择了某个内容,在这种情况下,它将是编辑,而不是添加文本……根据我的经验,这种“聪明”的行为倾向于加剧而不是取悦最终用户。而且,正如你所发现的,很难做到正确。如果我可以建议另一种方法。。。如果您正在查找电话号码(或任何可识别的模式),请验证TextBox内容(我建议在TextChanged事件中进行验证),如果内容有效,请将焦点切换到下一个输入控件。这还允许您将验证提取到单独的方法,而不是将其耦合到单个控件?因为在您的情况下,在PreviewKeyDown事件中,如果在maxlengh中放置5个字符,它将在6切换到下一个focusNavigation,因为在PreviewKeyDown事件中,文本框的内容没有更改,因此maxLength将始终显示按键前的字符数不理解您正在谈论的问题?您触发“PreviewKeyDown”的事件是在按键时触发/激活的,因此当您按下键盘上的几乎任何键时。问题是,当您进入txt1_PreviewKeyDown函数时,文本框中的文本没有更改,因为事件发生在您按键更改文本之前。因此,如果文本框中有“tes”并按“t”,则将输入txt1_PreviewKeyDown函数和((文本框)发送器).Text.Length值将是3,而不是您希望的4。请尝试在代码中添加一个断点,然后比较文本框中的字符数和代码给出的数字。但这正是我正在搜索的内容。文本框中有7个数字。如果我按下一个键,它是文本框中的第八个字符,我不想要它。所以我移到下一个盒子!
<TextBox Grid.Column="0" Name="txtC1" Margin="5" MaxLength="7" TextChanged="txt1_TextChanged"></TextBox>
<TextBox Grid.Column="1" Name="txt2" Margin="5" MaxLength="12" TextChanged="txt2_TextChanged"></TextBox>
<TextBox Grid.Column="2" Name="txt3" Margin="5" MaxLength="12" TextChanged="txt3_TextChanged"></TextBox>
    private void txt1_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (((TextBox)sender).MaxLength == ((TextBox)sender).Text.Length)
        {
            // move focus
            var ue = e.OriginalSource as FrameworkElement;
            e.Handled = true;
            ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
        }
    }
private void txt1_PreviewKeyDown(object sender, System.Windows.Input.KeyEventArgs e)
    {
        // Auto-tab when maxlength is reached
        if (((TextBox)sender).MaxLength == ((TextBox)sender).Text.Length)
        {
            if(e.Key != Key.Delete && e.Key != Key.Clear && e.Key != Key.Back && ((TextBox)sender).SelectionLength == 0)
            {
                // move focus
                var ue = e.OriginalSource as FrameworkElement;
                e.Handled = true;
                ue.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            } 

        }
    }