2011-03-02 44 views
5

Estoy tratando de establecer un InputGesture en un RoutedUICommand, enganchándolo para capturar cuando el usuario presiona Ctrl + =. Estoy usando un objeto KeyGesture, pero no puedo ver una entrada en la enumeración System.Windows.Input.Key para la tecla equals ('=').No hay entrada para la tecla Equals en System.Windows.Input.Key enum?

Lo que esperaba era poder hacer lo siguiente:

ZoomIn = new RoutedUICommand("Zoom In", "ZoomIn", typeof(Window), 
    new InputGestureCollection { 
     new KeyGesture(Key.Equals, ModifierKeys.Control) 
    }); 

¿Puede alguien me punto en la dirección correcta, por favor?

+5

¿Ha comprobado qué valor devuelve cuando presiona '='? – ChrisF

+0

Un muy buen punto. * cuelga la cabeza con vergüenza * –

+0

no se olvide de aceptar su propia respuesta como correcta :) –

Respuesta

2

Como lo señaló ChrisF, necesitaba relacionar un poco mi cerebro. Por lo que vale, el valor generado al manejar el evento KeyDown es Key.OemPlus.

Actualización:
Una consecuencia de esto es que, si estás haciendo lo mismo lo mismo que yo y usted va a utilizar el comando en un menú, es probable que desee utilizar el constructor sobrecargado para KeyGesture que toma un 3er parámetro de displayString. Por ejemplo:

new KeyGesture(Key.Equals, ModifierKeys.Control, "Ctrl+=") 

De lo contrario, verá la combinación de teclas muestra como (en mi caso) "Ctrl + OemPlus", que no es precisamente deseable. Es cierto que lo anterior aún no es genial, pero es mejor que "OemPlus".

+0

¿Entonces la clave igual es solo una clave más proporcionada por un fabricante de equipo original? Hmm. –

0

si lo pruebo, me sale Key.Unknown como el código de la llave, y PlatformKeyCode= = 0x000000bb (187)

+1

Interesante. Supongo que estás probando esto con Silverlight. –

+0

estaba a punto de decir "No", y entonces caí en la cuenta de que el proyecto que probé en * was * silverlight ... es aún más extraño que sean diferentes en wpf y silverlight. –

2

Un truco es coger el keydown turno, y si el keydown OemPlus viene antes de la keyup cambio, usted tiene un "OemEqual". El código puede verse así:

private bool shift = false; 
private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    Key key = e.Key; 
    switch (key) { 
     case Key.LeftShift: this.shift = true; break; 
     case Key.RightShift: this.shift = true; break; 
     case Key.C:   this.helper.Command(CMD.CLEAR); break; 
     case Key.Enter:  this.helper.Command(CMD.EVAL); break; 
     case Key.OemMinus: this.helper.Operator(OP.SUB); break; 
     case Key.OemPlus: 
      if (this.shift) { 
       this.helper.Operator(OP.ADD); 
      } else { 
       this.helper.Command(CMD.EVAL); 
      } break; 
     case Key.OemPeriod: this.helper.Number(NumberPad.DECIMAL); break; 
     case Key.D0:  this.helper.Number(NumberPad.ZERO); break; 
     case Key.D1:  this.helper.Number(NumberPad.ONE); break; 
     case Key.D2:  this.helper.Number(NumberPad.TWO); break; 
     : 
    } 
} 
private void Window_KeyUp(object sender, KeyEventArgs e) 
{ 
    Key key = e.Key; 
    switch (key) { 
     case Key.LeftShift: this.shift = false; break; 
     case Key.RightShift: this.shift = false; break; 
    } 
} 
Cuestiones relacionadas