2011-04-26 16 views
6

Establezco IsTabStop en falso en un cuadro de texto y sé que esto hace que el control no pueda recibir el foco, pero de acuerdo con el Silverlight Forums, todavía debería poder recibir eventos del mouse. Tengo el evento MouseLeftButtonUp conectado y un punto de interrupción en mi método tbxTotal_MouseLeftButtonUp, y nunca se golpea durante la depuración. El hilo en los Foros de SL ya es bastante antiguo, así que tal vez esto se modificó en alguna actualización. Quiero un cuadro de texto que no se pueda tabular, pero que aún se pueda editar. ¿Realmente debería ser tan difícil?IsTabStop = Falso en un cuadro de texto SL4

Respuesta

3

No me di cuenta de esto, pero parece ser el caso, Además, parece que no puedo hacer que MouseLeftButtonUp se dispare. MouseLeftButtonDown dispara aunque y usando eso puedes hacer esto.

<TextBox IsTabStop="False" MouseLeftButtonDown="TextBox_MouseLeftButtonDown" /> 

Luego, en el código puede manejar el evento de esta manera.

private void TextBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     var textBox = ((TextBox) sender); 
     textBox.IsTabStop = true; 
     textBox.Focus(); 
     textBox.IsTabStop = false; 
    } 

podría valer la pena, mientras que a lo envuelve en un CustomControl

public class FocusableTextBox : TextBox 
{ 
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
    { 
     if (!IsTabStop) 
     { 
      IsTabStop = true; 
      Focus(); 
      IsTabStop = false; 
     } 

     base.OnMouseLeftButtonDown(e); 
    } 
} 
+0

Heh, ni siquiera vi si MouseLeftButtonDown funcionaba. Solo va a mostrar que asumir es malo. Gracias. – seekerOfKnowledge

+0

Pero molestamente, solo llamar .Focus en MouseLeftButtonDown no funciona por eso tienes que jugar el baile de encendido/apagado :( – bendewey

+2

Además, como mi cuadro de texto está en una vista de árbol, algunas cosas raras están sucediendo. Cuando hago clic en mi cuadro de texto, se dispara el mouse hacia abajo, establezco IsTabStop en verdadero, le doy enfoque, y en LostFocus, establezco IsTabStop en falso. Sin embargo, el elemento de vista en árbol en el que se encuentra el cuadro de texto se enfoca, cancelando lo que acabo de hacer El elemento de la vista de árbol tiene IsTabStop configurado en falso, por lo que me parece extraño que pueda recibir el enfoque, pero también lo hice. En mi cuadro de texto evento LostFocus, en realidad enfoco de nuevo mi cuadro de texto, y luego directamente , establezca IsTabStop como falso. – seekerOfKnowledge

1

@seekerOfKnowledge: la desactivación de IsTabStop en el LostFocus es un buen enfoque, pero el truco re-enfoque es innecesaria. No tiene ningún efecto visible la primera vez porque el cambio de IsTabStop aún no ha surtido efecto. Este enfoque también se puede tomar con cualquier otro control.

 var control = sender as Control; 
     if (control != null) 
     { 
      control.MouseLeftButtonDown += (sender, args) => 
       { //This event fires even if the control isn't allowed focus. 
        //As long as the control is visible, it's typically hit-testable. 
        if (!control.IsTabStop) 
        { 
         control.IsTabStop = true; 
         //threading required so IsTabStop change can take effect before assigning focus 
         control.Dispatcher.BeginInvoke(() => 
          { 
           control.Focus(); 
          }); 
        } 
       }; 

      control.LostFocus += (sender, args) => 
       { //Remove IsTabStop once the user exits the control 
        control.IsTabStop = false; 
       }; 
     } 
Cuestiones relacionadas