poner - Establezca la posición de cursor/cursor al final del cuadro de texto de valor de cadena WPF
poner el foco en un textbox vb net (5)
En caso de que el cursor de ajuste de TextBox
de líneas TextBox
no sea suficiente. Prueba esto:
NumberOfDigits.ScrollToEnd();
Intento establecer la posición de cursor / cursor al final del valor de la cadena en mi cuadro de texto WPF cuando abro la ventana por primera vez. Uso el FocusManager para establecer el foco en mi cuadro de texto cuando se abre mi ventana.
Nada parece funcionar. ¿Algunas ideas?
Tenga en cuenta que estoy usando el patrón MVVM e incluí solo una parte del XAML de mi código.
<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>
Esto funcionó para mí. También estoy usando el patrón MVVM. Sin embargo, mi propósito al usar un MMVM es hacer que las pruebas de unidad sean posibles y facilitar la actualización de mi IU (poco acoplada). No me veo a mí mismo probando la posición del cursor, así que no me importa recurrir al código de detrás para esta simple tarea.
public ExpeditingLogView()
{
InitializeComponent();
this.Loaded += (sender, args) =>
{
Description.CaretIndex = Description.Text.Length;
Description.ScrollToEnd();
Description.Focus();
};
}
Puede establecer la posición de intercalación utilizando la propiedad CaretIndex
de un TextBox
de TextBox
. Tenga en cuenta que esto no es una DependencyProperty
. Sin embargo, puede configurarlo en XAML así:
<TextBox Text="123" CaretIndex="{x:Static System:Int32.MaxValue}" />
Recuerde establecer CaretIndex
después de la propiedad Text
o de lo contrario no funcionará. Por lo tanto, probablemente no funcionará si se une a un Text
como en su ejemplo. En ese caso, simplemente use código detrás de esta manera.
NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length;
Si su cuadro de texto (WinForms) es multilínea con una barra de desplazamiento vertical puede intentar esto:
textbox1.Select(textbox1.Text.Length-1, 1);
textbox1.ScrollToCaret();
Nota: En WPF .ScrollToCaret () no es miembro de TextBox.
También puede crear un Comportamiento que, aunque sigue siendo código subyacente, tiene la ventaja de ser reutilizable.
Ejemplo de una clase de comportamiento simple, utilizando el evento de foco 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, adjunte el comportamiento de la siguiente manera:
<TextBox x:Name="MyTextBox" Text="{Binding Value}">
<i:Interaction.Behaviors>
<behaviors:PutCursorAtEndTextBoxBehavior/>
</i:Interaction.Behaviors>
</TextBox>