Вопрос

Я хотел бы иметь возможность переопределить поведение по умолчанию для размещения курсора в замаскированном текстовом поле.

По умолчанию курсор размещается там, где был щелкнут мышью, замаскированное текстовое поле уже содержит символы из-за маски.

Я знаю, что вы можете скрыть каретку, как указано в этом почта, есть ли что-то подобное для размещения курсора в начале текстового поля, когда элемент управления получает фокус.

Это было полезно?

Решение

Это должно помочь:

    private void maskedTextBox1_Enter(object sender, EventArgs e)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            maskedTextBox1.Select(0, 0);
        });         
    }

Другие советы

Чтобы улучшить рабочее решение Аббаса, попробуйте следующее:

private void ueTxtAny_Enter(object sender, EventArgs e)
{
    //This method will prevent the cursor from being positioned in the middle 
    //of a textbox when the user clicks in it.
    MaskedTextBox textBox = sender as MaskedTextBox;

    if (textBox != null)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            int pos = textBox.SelectionStart;

            if (pos > textBox.Text.Length)
                pos = textBox.Text.Length;

            textBox.Select(pos, 0);
        });
    }
}

Этот обработчик событий можно повторно использовать с несколькими полями, и он не лишает пользователя возможности позиционировать курсор в середине введенных данных (т. е. не переводит курсор в нулевое положение, когда поле не пусто).

Я считаю, что это более точно имитирует стандартное текстовое поле.Единственный оставшийся сбой (который я вижу) заключается в том, что после события «Ввод» пользователь все еще может выбрать остальную часть (пустого) приглашения маски, если xe удерживает мышь и перетаскивает ее до конца.

Это большое улучшение по сравнению с поведением MaskedTextBoxes по умолчанию.Спасибо!

Я внес несколько изменений в отличное решение Измаила.Я предпочитаю вызывать BeginInvoke только в том случае, если курсор необходимо переместить.Я также вызываю этот метод из различных обработчиков событий, поэтому входным параметром является активный MaskedTextBox.

private void    maskedTextBoxGPS_Click( object sender, EventArgs e )
{
    PositionCursorInMaskedTextBox( maskedTextBoxGPS );
}


private void    PositionCursorInMaskedTextBox( MaskedTextBox mtb )
{
  if (mtb == null)    return;

  int pos = mtb.SelectionStart;

  if (pos > mtb.Text.Length)
    this.BeginInvoke( (MethodInvoker)delegate()  { mtb.Select( mtb.Text.Length, 0 ); });
}

Частичный ответ:вы можете расположить курсор, назначив элементу управления нулевую длину в событии MouseClick, например:

MaskedTextBox1.Select(5, 0)

... установит курсор на 5-й позиции символа в текстовом поле.

Причина, по которой этот ответ является лишь частичным, заключается в том, что я не могу придумать в целом надежный способ определить позицию, в которой находится курсор. должен позиционироваться одним щелчком мыши.Это возможно для некоторых масок, но в некоторых распространенных случаях (например,маска номера телефона в США), я не могу придумать простой способ отделить маску и символы подсказки от фактического пользовательского ввода...

//not the prettiest, but it gets to the first non-masked area when a user mounse-clicks into the control
private void txtAccount_MouseUp(object sender, MouseEventArgs e)
{
  if (txtAccount.SelectionStart > txtAccount.Text.Length)
    txtAccount.Select(txtAccount.Text.Length, 0);
}

Это решение работает для меня.Попробуйте, пожалуйста.

private void maskedTextBox1_Click(object sender, EventArgs e)
{

 maskedTextBox1.Select(maskedTextBox1.Text.Length, 0);
}

Я заставил свой работать с помощью события Click.... Никакого вызова не требовалось.

 private void maskedTextBox1_Click(object sender, EventArgs e)
{
     maskedTextBox1.Select(0, 0);              
}

В этом решении используется метод Click элемента MaskedTextBox, например, используемый Gman Cornflake;однако я счел необходимым разрешить пользователю щелкнуть внутри MaskedTextBox, как только он содержит данные, и курсор останется там, где он есть.

В приведенном ниже примере отключаются подсказки и литералы, оценивается длина данных в MaskedTextBox и, если она равна 0, курсор помещается в начальную позицию;в противном случае он просто обходит код, который помещает курсор в начальную позицию.

Код написан на VB.NET 2017.Надеюсь это поможет!

Private Sub MaskedTextBox1_Click(sender As Object, e As EventArgs) Handles MaskedTextBox1.Click
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
    If Me.MaskedTextBox1.Text.Length = 0 Then
        MaskedTextBox1.Select(0, 0)
    End If
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.IncludePromptAndLiterals
End Sub
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top