J'essaie de définir la position du curseur/curseur sur fin de la valeur de chaîne dans ma zone de texte WPF lorsque j'ouvre ma fenêtre pour la première fois. J'utilise le FocusManager pour définir le focus sur ma zone de texte lorsque ma fenêtre s'ouvre.
Rien ne semble fonctionner. Des idées?
Remarque, j'utilise le modèle MVVM et j'ai inclus uniquement une partie du XAML de mon code.
<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>
Vous pouvez définir la position du curseur à l'aide de la propriété CaretIndex
d'une TextBox
. N'oubliez pas qu'il ne s'agit pas d'un DependencyProperty
. Néanmoins, vous pouvez toujours le définir en XAML comme ceci:
<TextBox Text="123" CaretIndex="{x:Static System:Int32.MaxValue}" />
N'oubliez pas de définir la propriété CaretIndex
aprèsText
sinon cela ne fonctionnera pas. Ainsi, cela ne fonctionnera probablement pas si vous vous liez à Text
comme dans votre exemple. Dans ce cas, utilisez simplement du code comme ceci.
NumberOfDigits.CaretIndex = NumberOfDigits.Text.Length;
Vous pouvez également créer un comportement qui, tout en restant codé, a l'avantage d'être réutilisable.
Exemple d'une classe de comportement simple, utilisant l'événement focus de la zone de texte:
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;
}
}
Ensuite, dans votre XAML, vous attachez le comportement comme suit:
<TextBox x:Name="MyTextBox" Text="{Binding Value}">
<i:Interaction.Behaviors>
<behaviors:PutCursorAtEndTextBoxBehavior/>
</i:Interaction.Behaviors>
</TextBox>
Cela a fonctionné pour moi. J'utilise également le modèle MVVM. Cependant, mon but pour utiliser un MMVM est de rendre possible le test unitaire et de faciliter la mise à jour de mon interface utilisateur (à couplage lâche). Je ne me vois pas tester l'unité de la position du curseur, donc cela ne me dérange pas de recourir au code derrière pour cette tâche simple.
public ExpeditingLogView()
{
InitializeComponent();
this.Loaded += (sender, args) =>
{
Description.CaretIndex = Description.Text.Length;
Description.ScrollToEnd();
Description.Focus();
};
}
Si votre zone de texte (WinForms) est multiligne avec une barre de défilement verticale, vous pouvez essayer ceci:
textbox1.Select(textbox1.Text.Length-1, 1);
textbox1.ScrollToCaret();
Remarque: Dans WPF .ScrollToCaret () n'est pas membre de TextBox.
En cas de multiligne TextBox
le réglage du curseur ne suffit pas. Essaye ça:
NumberOfDigits.ScrollToEnd();