2012-09-12 11 views
5

que actualmente tienen un C# winforms aplicación con Ctrl + C y Ctrl + V obligado como atajos de teclado en el menú principal Editar. Existe algún comportamiento de copiar/pegar dentro del código que responde a estos elementos del menú, como copiar y pegar filas en listviews.copia personalizada/comportamiento de pasta con C# winforms al tiempo que permite editar el texto de copiar/pegar

Sin embargo, mi problema es que puede editar texto dentro de una fila, y cuando lo hace, quiero que Ctrl + C y Ctrl + V no activen el comando del menú de edición y prefieran la copia de texto normal /pegar.

Una cosa que probé está desencadenando eventos BeforeLabelEdit y AfterLabelEdit, y de forma manual deshabilitar/volver a habilitar los elementos de menú desde el interior de allí. Desafortunadamente, parece que un atajo de teclado en un elemento de menú desactivado todavía desencadena el evento menu_Popup, que se utiliza actualmente para decidir qué elementos del menú deben habilitarse/deshabilitarse. (Por ejemplo, "Pegar" solo está activo si hay texto en el portapapeles). Así que incluso si deshabilito el elemento del menú, el atajo de teclado todavía activará el evento Popup, que volverá a habilitar el elemento del menú. (¿Esto es un error?)

No encuentro ningún método para deshabilitar temporalmente un atajo de teclado de elementos de menú sin almacenar manualmente el acceso directo anterior, estableciendo el acceso directo como nulo, y luego copiándolo cuando necesito volver a habilitarlo (que se siente sucio).

preponderantes con Seguramente el comportamiento de copiar/pegar, o la adición a la misma, es una cosa normal que desee hacer? ¿Hay un mejor patrón para usar aquí?

+0

ovveriding copy paste suena como una mala idea para mí. estoy acostumbrado a 'copiar/pegar' siempre funciona igual en todas las aplicaciones. tu aplicación me confundirá. pero si insiste, ¿por qué no verifica el enfoque? si el foco está en su cuadro de texto, una copia pegar si no lo hace la otra – Nahum

+0

Nuestro comportamiento personalizado de copiar/pegar solo trata con copiar y pegar filas cuando no está editando texto.Quiero el comportamiento de copiar/pegar por defecto cuando está editando texto. –

+2

Borrar la tecla de método abreviado del menú es la forma más fácil. Otras alternativas serán 'más sucias'. –

Respuesta

0

Parece que tendrá que usar algo de un nivel inferior al que ofrece C# si desea anular el comportamiento predeterminado de copiar/pegar (consulte Clipboard event C# y Detect & Differentiate Clipboard Events (Cut,Copy and Paste)). Sin embargo, quizás podría poner su lógica detrás de un "guardia" que sepa cómo dirigir una solicitud de acción (como la "Copia") y luego redirigirla como corresponda.

Aquí es una clase de muestra:

namespace Your.App 
{ 
    public class GuardedCommand 
    { 
     public bool CurrentlyEditing { get; set; } 
     public GuardedCommand() 
     { 
      CurrentlyEditing = false; 
     } 
     public void DoCopy() 
     { 
      if(CurrentlyEditing) 
       StandardCopyCommand(); 
      else 
       ShortcutCopyCommand(); 
     } 
     void ShortcutCopyCommand() { /*menu work here (or delegate to another class)*/ } 
     void StandardCopyCommand() { /*"normal" work here (or delegate again)*/ } 
    } 
} 

Para utilizar debe crear la clase, a continuación, establezca la propiedad es guardedCommand.CurrentlyEditing según proceda, en los BeforeLabelEdit y AfterLabelEdit eventos. Luego, donde sea que capture el atajo CTRL + C, simplemente invoque guardedCommand.DoCopy() y se encargará del resto.

Si está buscando leer sobre un patrón para lo que está buscando hacer, entonces revise el State Pattern, que el código anterior es una especie de implementación. Para ser un Patrón de Estado (o Estrategia) real, necesitaría tener clases concretas separadas que implementen DoCopy() y DoPaste() en lugar de simplemente usar un conmutador if/else o. Luego, cuando se cambie el CurrentlyEditing, se establecerá la implementación concreta adecuada como la clase actual utilizada para manejar el método DoCopy().

Y sólo porque me tomó más tiempo para escribir ese párrafo de lo que tendría que acaba de darle un poco de código, aquí hay algo de código:

namespace Your.App 
{ 
//correct implementation of the State Pattern 
    interface IClipboard 
    { 
     void Copy(); 
     void Paste(); 
    } 
    class MyCustomClipboard : IClipboard 
    { 
     public void Copy() { /*your special code*/ } 
     public void Paste() { /*your code again*/ } 
    } 
    class DefaultClipboard : IClipboard 
    { 
     public void Copy() { /*default code*/ } 
     public void Paste() { /*default code again*/ } 
    } 
    public class StateClass 
    { 
     IClipboard State { get; set; } 
     public StateClass() 
     { 
      CurrentlyEditing = false; 
     } 
     bool _currentlyEditing; 
     public bool CurrentlyEditing 
     { 
      get { return _currentlyEditing; } 
      set 
      { 
       _currentlyEditing = value; 
       if(_currentlyEditing) 
        State = new DefaultClipboard(); 
       else 
        State = new MyCustomClipboard(); 
      } 
     } 
     public void Copy() 
     { 
      State.Copy(); 
     } 
     public void Paste() 
     { 
      State.Paste(); 
     } 
    } 
} 

Como se puede ver, esto puede ser un poco exagerado cuando hay son solo dos estados (y la cantidad de estados probablemente no aumentará).

+0

¿Esto significa que necesitaría codificar el comportamiento predeterminado de copiar/pegar yo mismo? Esto es algo que esperaba evitar. Además, ¿significa esto que no podría enumerar los comandos en el menú en la tecla de acceso directo columnn a la derecha? Lo que me sorprende es que, de forma predeterminada, el método KeyDown no captura Ctrl + C cuando estoy editando una etiqueta, pero sí cuando no lo estoy editando (lo cual es útil). Este es un comportamiento diferente al de las teclas de método abreviado del menú, que cuando se asigna, activará si estoy editando o no. –

+0

Lo siento, por alguna razón tuve la impresión de que tenías código para usar el copiar/pegar predeterminado ya implementado. Después de volver a leer tu pregunta, veo que nunca mencionas eso. Sospecho que la "mejor" solución será una implementación del Estado (o [Estrategia] (http://en.wikipedia.org/wiki/Strategy_pattern)) Patrón que se encarga de configurar y borrar los accesos directos para usted como @John mencionado, dependiendo de en qué estado se encuentre/qué estrategia quiera usar. –

Cuestiones relacionadas