Solución:
Puede establecer la posición del cursor usando CaretIndex
propiedad de un TextBox
. Tenga en cuenta que esta no es una DependencyProperty
. Sin embargo, aún puede configurarlo en XAML de esta manera:
<TextBox Text="123" CaretIndex="{x:Static System:Int32.MaxValue}" />
Por favor recuerde configurar CaretIndex
después Text
propiedad o de lo contrario no funcionará. Por lo tanto, probablemente no funcionará si se une a Text
como en tu ejemplo. En ese caso, simplemente use código subyacente como este.
NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length;
También puede crear un comportamiento que, aunque sigue siendo un código subyacente, tiene la ventaja de ser reutilizable.
Ejemplo de una clase de comportamiento simple, usando el evento de enfoque del cuadro de texto:
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;
}
}
Luego, en su XAML, adjunta el comportamiento de la siguiente manera:
<TextBox x:Name="MyTextBox" Text="{Binding Value}">
<i:Interaction.Behaviors>
<behaviors:PutCursorAtEndTextBoxBehavior/>
</i:Interaction.Behaviors>
</TextBox>
Esto funcionó para mí. También estoy usando el patrón MVVM. Sin embargo, mi propósito al usar un MMVM es hacer posible la prueba unitaria y facilitar la actualización de mi interfaz de usuario (poco acoplada). No me veo probando unitariamente la posición del cursor, así que no me importa recurrir al código subyacente para esta sencilla tarea.
public ExpeditingLogView()
{
InitializeComponent();
this.Loaded += (sender, args) =>
{
Description.CaretIndex = Description.Text.Length;
Description.ScrollToEnd();
Description.Focus();
};
}