Установите позицию курсора / курсора в C # WPF при нажатии на текстовое поле - PullRequest
0 голосов
/ 09 октября 2018

Я использую текстовое поле для окна входа в систему.Я хочу, чтобы текстовое поле отображало «Имя пользователя» светло-серым, чтобы пользователь знал, как использовать это поле для ввода имени пользователя.Всякий раз, когда пользователь нажимает на текстовое поле, даже если оно находится в середине слова username, я хочу, чтобы курсор переместился на первую позицию, а имя пользователя исчезнет, ​​когда они начнут печатать.Я попытался использовать событие PreviewMouseDown, но оно работает только внутри точек останова, но не срабатывает вообще за его пределами.Используя событие PreviewMouseUp, оно работает, но другие позиции каретки можно выбрать до того, как курсор переместится в начало.Я хочу, чтобы это выглядело так, как будто пользователь не может выбрать любую позицию курсора, кроме первой.Это код, который я пробовал.

private bool textboxuserfirstchange = true;

private void eventTextChanged(object sender, TextChangedEventArgs e)
{
    if (textBoxUser.Text != "Username")
    {
        if (textboxuserfirstchange)
        {
            textBoxUser.Text = textBoxUser.Text[0].ToString();
            textBoxUser.SelectionStart = 1;
            textBoxUser.Opacity = 100;
        }
    textboxuserfirstchange = false;
    } 
}

private void eventPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    if (textboxuserfirstchange)
    {
        textBoxUser.Focus();
        textBoxUser.Select(0, 0);     //None of these working
        textBoxUser.SelectionStart = 0;
        textBoxUser.CaretIndex = 0;
    }
}

1 Ответ

0 голосов
/ 10 октября 2018

Например, вы можете обработать события GotKeyboardFocus и PreviewTextInput.Как то так:

private const string Watermark = "Username";
private void TextBox_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    if (textBoxUser.Text == Watermark)
        textBoxUser.Dispatcher.BeginInvoke(new Action(() => textBoxUser.CaretIndex = 0), DispatcherPriority.Background);
}

private void textBoxUser_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    if (textBoxUser.Text == Watermark)
        textBoxUser.Text = string.Empty;
}
...