es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

WPF ¿Cómo evito que el texto de MaskedTextBox se borre al hacer clic en él?

Este es el xaml de mi MaskedTextBox (de Extended WPF Toolkit) en el cual enlazo el texto con la propiedad Time de mi datacontext.


Esta es la parte de mi Datacontext que lo actualiza, y mi propiedad Time.

public class MyViewModel : ObservableObject, INavigationAware {
public string Time {
get;
set; //break point 1
}
public static void UpdateTime(string time) {
Time = time;
OnPropertyChanged("Time");
}
}

El problema es que cada vez que hago clic en el MaskedTextBox, el texto vuelve al carácter de ayuda.

Por ejemplo, al iniciar la aplicación, el MaskedTextBox tendría 00:00:00. Después de algún evento, actualizo la propiedad de tiempo a 12:34:56, y se mostrará correctamente en la interfaz de usuario. Pero cuando hago clic en el MaskedTextBox, cambia el texto de vuelta a 00:00:00.

La pila de llamadas de Break point 1 solo muestra “código externo”. No pude encontrar una opción en el documento para desactivar este comportamiento, ¿cómo puedo detenerlo?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el control MaskedTextBox está restableciendo el texto al carácter de indicación cuando obtiene el foco. Una posible solución es manejar el evento PreviewGotKeyboardFocus del control y establecer la propiedad Handled en true para evitar que el control maneje el evento por sí mismo. Aquí tienes un ejemplo:

    <wpfx:maskedtextbox x:name="MyMaskedTextBox" allowpromptasinput="True" mask="00:00:00" promptchar="0" resetonprompt="False" text="{Binding Time, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" previewgotkeyboardfocus="MyMaskedTextBox_PreviewGotKeyboardFocus"></wpfx:maskedtextbox>
    
    public class MyViewModel : ObservableObject, INavigationAware {
        public string Time { 
            get; 
            set; //break point 1
        } 
        public static void UpdateTime(string time) {
            Time = time;
            OnPropertyChanged("Time");
        }
    
        private void MyMaskedTextBox_PreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
        {
            // Evitar que el MaskedTextBox restablezca el texto al carácter de indicación
            e.Handled = true;
        }
    }
    

    Al establecer la propiedad Handled en true, le estamos indicando al control que ignore el evento y no restablezca el texto al carácter de indicación. Esto debería permitir que el texto permanezca tal como está, incluso cuando el control obtiene el foco.

Comments are closed.