wake-up-neo.com

Setzen Sie die Caret- / Cursor-Position an das Ende des WPF-Textfelds für den Zeichenfolgenwert

Ich versuche, die Caret-/Cursor-Position auf Ende des Zeichenfolgenwerts in meinem WPF-Textfeld zu setzen, wenn ich mein Fenster zum ersten Mal öffne. Ich verwende den FocusManager, um den Fokus auf mein Textfeld zu setzen, wenn mein Fenster geöffnet wird.

Nichts scheint zu funktionieren. Irgendwelche Ideen?

Beachten Sie, dass ich das MVVM-Muster verwende und nur einen Teil der XAML aus meinem Code übernommen habe.

<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>
65
Zamboni

Sie können die Caret-Position mit der Eigenschaft CaretIndex eines TextBox festlegen. Bitte beachten Sie, dass dies kein DependencyProperty ist. Trotzdem können Sie es in XAML so einstellen:

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

Denken Sie daran, die Eigenschaft CaretIndexafterText zu setzen, da dies sonst nicht funktioniert. Daher wird es wahrscheinlich nicht funktionieren, wenn Sie wie in Ihrem Beispiel an Text binden. Verwenden Sie in diesem Fall einfach CodeBehind.

NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length;
91
wpfwannabe

Sie können auch ein Verhalten erstellen, das zwar Code-behind ist, aber den Vorteil hat, dass es wiederverwendbar ist.

Beispiel einer einfachen Verhaltensklasse unter Verwendung des Fokusereignisses des Textfelds:

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;
    }
}    

Anschließend fügen Sie in Ihrer XAML das folgende Verhalten hinzu:

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

Das hat bei mir funktioniert. Ich verwende auch das MVVM-Muster. Mein Zweck für die Verwendung einer MMVM besteht jedoch darin, Unit-Tests zu ermöglichen und die Aktualisierung meiner Benutzeroberfläche (lose gekoppelt) zu vereinfachen. Ich sehe mich nicht in einer Einheit, die die Position des Cursors testet, daher macht es mir nichts aus, für diese einfache Aufgabe auf den Code dahinter zurückzugreifen.

    public ExpeditingLogView()
    {
        InitializeComponent();

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

Wenn Ihr Textfeld (WinForms) mehrzeilig mit einer vertikalen Bildlaufleiste ist, können Sie Folgendes versuchen:

textbox1.Select(textbox1.Text.Length-1, 1);
textbox1.ScrollToCaret();

Hinweis: In WPF ist .ScrollToCaret () kein Mitglied von TextBox.

3
molbalga

Bei mehrzeiligen TextBox -Einstellungen reicht der Cursor nicht aus. Versuche dies:

NumberOfDigits.ScrollToEnd();
1
andreikashin