将插入符号/光标位置设置为字符串值 WPF 文本框的末尾

     2023-02-16     26

关键词:

【中文标题】将插入符号/光标位置设置为字符串值 WPF 文本框的末尾【英文标题】:Set the caret/cursor position to the end of the string value WPF textbox 【发布时间】:2011-02-22 18:03:54 【问题描述】:

当我第一次打开窗口时,我尝试将插入符号/光标位置设置为 WPF 文本框中字符串值的 end。当我的窗口打开时,我使用 FocusManager 将焦点设置在我的文本框上。

似乎没有任何效果。有什么想法吗?

注意,我使用的是 MVVM 模式,并且我只包含了我的代码中的一部分 XAML。

<Window 
    FocusManager.FocusedElement="Binding ElementName=NumberOfDigits"
    Height="400" Width="800">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <TextBox Grid.Column="0" Grid.Row="0" 
                 x:Name="NumberOfDigits"
                 IsReadOnly="Binding Path=IsRunning, Mode=TwoWay"
                 VerticalContentAlignment="Center"
                 Text="Binding Path=Digits, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged"/>
        <Button Grid.Column="0" Grid.Row="1" 
                 Margin="10,0,10,0"
                 IsDefault="True"
                 Content="Start" 
                 Command="Binding StartCommand"/>
    </Grid>
 </Window>

【问题讨论】:

【参考方案1】:

您可以使用TextBoxCaretIndex 属性设置插入符号位置。请记住,这不是DependencyProperty。尽管如此,您仍然可以像这样在 XAML 中设置它:

<TextBox Text="123" CaretIndex="x:Static System:Int32.MaxValue" />

请记住设置CaretIndex after Text 属性,否则它将不起作用。因此,如果您像示例中那样绑定到Text,它可能不起作用。在这种情况下,只需像这样使用代码隐藏。

NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length;

【讨论】:

【参考方案2】:

您还可以创建一个行为,虽然它仍然是代码隐藏的,但具有可重用的优势。

一个简单的行为类示例,使用文本框的焦点事件:

class PutCursorAtEndTextBoxBehavior: Behavior<UIElement>

   private TextBox _textBox;

   protected override void OnAttached()
   
        base.OnAttached();

        _textBox = AssociatedObject as TextBox;

        if (_textBox == null)
        
            return;
        
        _textBox.GotFocus += TextBoxGotFocus;
   

    protected override void OnDetaching()
    
        if (_textBox == null)
        
            return;
        
        _textBox.GotFocus -= TextBoxGotFocus;

        base.OnDetaching();
    

    private void TextBoxGotFocus(object sender, RoutedEventArgs routedEventArgs)
    
        _textBox.CaretIndex = _textBox.Text.Length;
    
    

然后,在您的 XAML 中,附加如下行为:

    <TextBox x:Name="MyTextBox" Text="Binding Value">
        <i:Interaction.Behaviors>
            <behaviors:PutCursorAtEndTextBoxBehavior/>
        </i:Interaction.Behaviors>
    </TextBox>

【讨论】:

【参考方案3】:

这对我有用。我也在使用 MVVM 模式。但是,我使用 MMVM 的目的是使单元测试成为可能,并更容易更新我的 UI(松散耦合)。我没有看到自己对光标的位置进行单元测试,所以我不介意为这个简单的任务求助于背后的代码。

    public ExpeditingLogView()
    
        InitializeComponent();

        this.Loaded += (sender, args) =>
                                        
            Description.CaretIndex = Description.Text.Length;
            Description.ScrollToEnd();
            Description.Focus();
        ;
    

【讨论】:

【参考方案4】:

如果是多行TextBox 设置光标是不够的。 试试这个:

NumberOfDigits.ScrollToEnd();

【讨论】:

仅代码答案不是好的答案,添加几行来解释问题所在以及您的代码修复它的原因【参考方案5】:

在 WPF 中,如果行足够长,滚动到行尾也很重要。所以我使用以下几行:

text_Box.Text = text;
text_Box.CaretIndex = text.Length;
text_Box.ScrollToHorizontalOffset(double.MaxValue);
// or you can use this - for me works also
// text_Box.ScrollToHorizontalOffset(text_Box.GetRectFromCharacterIndex(openFileDialog.FileName.Length).Right);

但请阅读此警告(对我来说这很好 - 可能已经修复): TextBox ScrollToHorizontalOffset will not scroll after text is long enough

【讨论】:

【参考方案6】:

如果textbox 用于模板绑定或任何类型的惰性绑定或惰性值分配,@Louis 解决方案将不起作用

因此,如果 textbox 在 Datagrid 单元格中用作模板,该解决方案将需要进行微小的修改才能工作

那就是订阅文本更改事件

 class PutCursorAtEndTextBoxBehavior : Behavior<UIElement>
    
        private TextBox _textBox;

        protected override void OnAttached()
        
            base.OnAttached();

            _textBox = AssociatedObject as TextBox;

            if (_textBox == null)
            
                return;
            
            _textBox.GotFocus += TextBoxGotFocus;
            // to make it work with binding
            _textBox.TextChanged += TextBoxGotFocus;
        

        protected override void OnDetaching()
        
            if (_textBox == null)
            
                return;
            
            _textBox.GotFocus -= TextBoxGotFocus;
            _textBox.TextChanged -= TextBoxGotFocus;

            base.OnDetaching();
        

        private void TextBoxGotFocus(object sender, RoutedEventArgs routedEventArgs)
        
            _textBox.CaretIndex = _textBox.Text.Length;
        
    

【讨论】:

【参考方案7】:

这里没有一个答案对我有用。我正在为 TextBox 使用绑定,并且需要在窗口弹出后立即移动插入符号。这是为我做的:

public MyWindow()

    InitializeComponent();

    ContentRendered += (sender, args) =>
    
        MyTextBox.CaretIndex = MyTextBox.Text.Length;
        MyTextBox.ScrollToEnd(); // not necessary for single line texts
        MyTextBox.Focus();
    ;

类似于 Ceranski 的回答。我们添加到ContentRendered,而不是添加到Loaded 事件。

【讨论】:

它对我有用,但 MyTextBox.ScrollToEnd() 不是必需的。【参考方案8】:

由于某些原因,我不得不使用:

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => 

    textBox.CaretIndex = textBox.Text.Length;
    textBox.ScrollToEnd();
));

【讨论】:

【参考方案9】:

试试这个给定的方法:https://docs.microsoft.com/en-us/dotnet/desktop/wpf/controls/position-the-cursor-at-the-beginning-or-end-of-text?view=netframeworkdesktop-4.8

textBox.Select(2,0);

【讨论】:

【参考方案10】:

我想创建一个用户控件/视图,其中包含绑定到 ViewModel 的预填充文本框,当控件打开时,焦点会自动设置在文本框和末尾的插入符号位置。这是我让它工作的唯一方法:

public TextBoxDialogView()

    InitializeComponent();

    TextBox.GotKeyboardFocus += (sender, args) =>
    
        TextBox.CaretIndex = TextBox.Text.Length;
    ;
    _ = TextBox.Focus();

到目前为止似乎工作得很好......

【讨论】:

文本框光标不闪烁

...在其中以便用户可以直接开始编辑。我得到的最接近的是插入符号已显示但不闪烁,我需要再次 查看详情

RichTextBox C# 设置插入符号位置 winforms

...在,当用户按下主页按钮时,我希望插入符号位于“Me:”字符串之后。因此对于Shift+Home组合或三次鼠标单击或Ctr 查看详情

WPF RichTextBox 将插入符号定位到具有给定索引的可见字符

】WPFRichTextBox将插入符号定位到具有给定索引的可见字符【英文标题】:WPFRichTextBoxpositioncarettovisiblecharacterwithgivenindex【发布时间】:2016-03-0612:07:53【问题描述】:我一直在WPF中寻找一种快速的方法,以编程方式将光标设置为指... 查看详情

反应本机文本输入,按下时更改光标位置

...间值。因为每次我按下文本输入时,插入符号都位于插入字符串的末尾。例如:值:123456---->我只想删除/更改23,但我不能,因为插入符号超过了最后 查看详情

在 html 文本框中设置键盘插入符号位置

】在html文本框中设置键盘插入符号位置【英文标题】:Setkeyboardcaretpositioninhtmltextbox【发布时间】:2010-10-0511:31:41【问题描述】:有人知道如何将文本框中的键盘插入符号移动到特定位置吗?例如,如果一个文本框(例如输入元... 查看详情

将文本附加到文本区域,但将插入符号位置设置为行尾

】将文本附加到文本区域,但将插入符号位置设置为行尾【英文标题】:Appendtexttotextareabutsetcaretpositiontoendofline【发布时间】:2020-01-1806:27:04【问题描述】:嗨!我目前正在尝试使用JavaFX构建终端仿真器,我想在按下“enter”后... 查看详情

将插入符号位置设置为始终以 contenteditable div 结尾 [重复]

】将插入符号位置设置为始终以contenteditablediv结尾[重复]【英文标题】:Setthecaretpositionalwaystoendincontenteditablediv[duplicate]【发布时间】:2013-04-2006:58:00【问题描述】:在我的项目中,我试图将插入符号的位置始终设置到文本的末尾... 查看详情

设置层的显示效果的选项是

...的显示效果的选项是1、首先清空版面,当然如果你已经插入图片或者是输入了其他内容可以不用清理,点击插入——文本框,插入一个横向的文本框,输入文字“中国”,2、选中文本框里面的“中国”二字,切换到“开始”,... 查看详情

文本框插入符号样式

】文本框插入符号样式【英文标题】:TextBoxCaretStyling【发布时间】:2012-03-0615:13:30【问题描述】:我发现了一些关于在WPF4中设置CaretBrushes的内容,但实际上有没有人更改过插入符本身?我想做的是在INSERT模式下使用OVERWRITE插入... 查看详情

c#textbox中鼠标光标位置始终在最后谢谢

...。如果控件中没有选择任何文本,则该属性指示新文本的插入点。如果将此属性设置为超出了控件中文本长度的位置的值,则选定文本的起始位置将放在最后一个字符之后。如果在文本框控件中选择了文本,则更改此属性可能会... 查看详情

在文本框的任何文本的末尾设置光标[重复]

...318:19:44【问题描述】:我有一个文本框,其中已经显示了字符串。将光标带到我已经在做的文本框txtbox.Focus();但是如何让光标在文本框中的字符串末尾?【问题讨论】:是WPF还是winforms希望对您有帮助:***.com/quest 查看详情

如何将光标设置到 Internet Explorer 中文本 INPUT 字段的字符串值中的特定位置?

】如何将光标设置到InternetExplorer中文本INPUT字段的字符串值中的特定位置?【英文标题】:HowdoIsetthecursortoaparticularpositioninthestringvalueofatextINPUTfieldinInternetExplorer?【发布时间】:2011-10-1222:34:27【问题描述】:我已经在Firefox、Safari... 查看详情

WPF 自定义控件将文本框文本重置为默认值

】WPF自定义控件将文本框文本重置为默认值【英文标题】:WPFCustomcontrolresettextboxtexttoadefaultvalue【发布时间】:2021-11-0817:36:50【问题描述】:我需要一个带有按钮的文本框,它必须显示默认值,但仍应允许用户输入我需要存储在V... 查看详情

UITextField 将光标设置为开始文本位置

】UITextField将光标设置为开始文本位置【英文标题】:UITextFieldsetcursortostarttextposition【发布时间】:2013-04-1016:19:22【问题描述】:我需要移动光标以在文本字段上设置焦点时开始文本位置。可以吗?【问题讨论】:【参考方案1】... 查看详情

文本区域 (JTextArea) 的自动文本滚动,插入符号位置设置为最后一行的开头

】文本区域(JTextArea)的自动文本滚动,插入符号位置设置为最后一行的开头【英文标题】:Autotextscrollfortextarea(JTextArea)withcaretpositionsettothebeginningofthelastline【发布时间】:2012-05-2801:45:41【问题描述】:我有一个简单的Java问题。我... 查看详情

获取文本输入字段中的光标位置(以字符为单位)

...】:2011-02-2305:44:58【问题描述】:如何从输入字段中获取插入符号的位置?我通过谷歌找到了一些零碎的东西,但没有什么防弹的。基本上像jQuery插件这样的东西是理想的,所以我可以简单地做$("#myinput").caretPosition()【问题 查看详情

获取文本输入字段中的光标位置(以字符为单位)

...】:2011-02-2305:44:58【问题描述】:如何从输入字段中获取插入符号的位置?我通过谷歌找到了一些零碎的东西,但没有什么防弹的。基本上像jQuery插件这样的东西是理想的,所以我可以简单地做$("#myinput").caretPosition()【问题 查看详情

获取文本输入字段中的光标位置(以字符为单位)

...】:2011-02-2305:44:58【问题描述】:如何从输入字段中获取插入符号的位置?我通过谷歌找到了一些零碎的东西,但没有任何证据。基本上像jQuery插件这样的东西是理想的,所以我可以简单地做$("#myinput").caretPosition()【问题讨 查看详情