Ответ 1
Это должно сделать трюк:
private void maskedTextBox1_Enter(object sender, EventArgs e)
{
this.BeginInvoke((MethodInvoker)delegate()
{
maskedTextBox1.Select(0, 0);
});
}
Я хотел бы иметь возможность переопределить поведение по умолчанию для позиционирования каретки в скрытом текстовом поле.
По умолчанию используется каретка, на которую была нажата мышь, маскированное текстовое поле уже содержит символы из-за маски.
Я знаю, что вы можете скрыть карету, как указано в этой сообщении, есть ли что-то подобное для позиционирования каретки в начале текстового поля, когда элемент управления получает фокус,
Это должно сделать трюк:
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);
});
}
}
Этот обработчик событий может быть повторно использован с несколькими блоками, и он не убирает способность пользователя размещать курсор в середине введенных данных (т.е. не заставляет курсор в нулевое положение, когда поле не является пустой).
Я считаю, что это более точно подражает стандартным текстовым полям. Остается только сбой (что я вижу) заключается в том, что после события 'Enter' пользователь все еще может выбрать оставшуюся часть (пустой) приглашения маски, если xe удерживает мышь и тянет до конца.
Это большое улучшение по сравнению с поведением MaskedTextBoxes по умолчанию. Спасибо!
Я сделал несколько изменений в отличном решении Ishmaeel. Я предпочитаю называть 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 ); });
}
Частичный ответ: вы можете позиционировать каретку, назначив элемент управления длиной 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. Не требуется Invoke.
private void maskedTextBox1_Click(object sender, EventArgs e)
{
maskedTextBox1.Select(0, 0);
}