2009-12-02 9 views
1

J'écris une petite application en C# en utilisant Windows Forms. Je veux laisser mes utilisateurs copier et coller des données autour de l'application et il y a quelques contrôles personnalisés, par exemple un est un sélecteur de couleur.Copier/Coller dans Windows Forms avec des contrôles personnalisés

Certains des contrôles par défaut (au moins le TextBox) ont déjà une fonctionnalité de copier-coller. Je veux avoir la même chose avec mon sélecteur de couleur, et je veux aussi un menu 'Edition' en haut pour copier et coller.

En ce moment, je ne vois pas comment faire cela d'une manière agréable, mon amure actuelle est d'attraper le Ctrl + C et Ctrl + V commandes et les clics de menu et passer par une fonction qui utilise des appels Win32 pour trouver le contrôle ciblé, puis copier ou coller des données depuis ou vers le contrôle (avec une instruction if en fonction du type de contrôle ciblé).

L'alternative semble être d'écrire la manipulation des touches dans chaque contrôle personnalisé, mais avec cette méthode, je ne suis pas sûr de savoir comment incorporer les fonctions du menu Edition.

Comment procéder de manière élégante ou plus «standard»?

+0

N'essayez aussi le code * [.NET Framework - Couper, copier, coller le code] (http://www.eggheadcafe.com/software/aspnet/31867610/cut-copy-paste-code.aspx) *. –

+0

* [Implémenter les commandes de menu "couper", "copier", "coller" dans l'application Windows Form] (http://social.msdn.microsoft.com/forums/fr-FR/netfxbcl/thread/4654a0e3-bb68-494e -a1f2-03884a72f7d6 /) * est similaire à votre problème. Il suffit de le vérifier .. –

+0

Merci, cela semble surtout parler d'utiliser réellement le presse-papiers, que je n'ai aucun problème avec. Je ne savais pas à propos de TextBox.Copy() mais ce que j'essaie d'obtenir est un meilleur moyen de copier et coller dans les contrôles personnalisés, de sorte qu'ils répondent aux clics de clavier et de menu, mais sans beaucoup de déclarations if ou code de gestion de clé par contrôle. –

Répondre

3

La manière la plus simple consiste à activer KeyPreview dans le formulaire, puis de suivre la logique dans l'événement KeyDown.

Mais une autre approche peut être utile:
Si vous avez dans votre application gagnant un menu (par exemple & Edition => Copier (Coller)).

Activer pour que les menus les raccourcis clavier

// 
// editToolStripMenuItem 
// 
this.editToolStripMenuItem.DropDownItems.AddRange(new 
System.Windows.Forms.ToolStripItem[] { 
this.copyToolStripMenuItem, 
this.pasteToolStripMenuItem}); 
this.editToolStripMenuItem.Text = "Edit"; 
// 
// copyToolStripMenuItem 
// 
**this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys) 
((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C)));** 
this.copyToolStripMenuItem.Text = "&Copy"; 
// 
// pasteToolStripMenuItem 
// 
**this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys) 
((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V)));** 
this.pasteToolStripMenuItem.Text = "&Paste"; 

Vous avez donc vos raccourcis pour copier coller. Maintenant gérer seulement vos clics de menu

private void copyToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Image myData = this.ActiveControl.BackgroundImage; 
    Clipboard.SetImage(myData); 
} 

private void pasteToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Image myData = Clipboard.GetImage(); 
    this.ActiveControl.BackgroundImage = myData; 
} 

Sûrement, vous pouvez rendre invisible votre menu, si vous ne voulez pas le montrer à l'utilisateur.

============================================== ================================= MISE à JOUR

Code

pour plusieurs contrôles:

private void copyToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     ICopyPasteable control = sender as ICopyPasteable; 
     if (control != null) 
     { 
      control.CopyToClipboard(); 
     } 
    } 

    private void pasteToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     ICopyPasteable control = sender as ICopyPasteable; 
     if (control != null) 
     { 
      control.PasteFromClipboard(); 
     } 
    } 
} 


public interface ICopyPasteable 
{ 
    void CopyToClipboard(); 
    void PasteFromClipboard(); 
} 

public class MyTextBox : TextBox, ICopyPasteable 
{ 

    #region ICopyPasteable Membres 

    public void CopyToClipboard() 
    { 
     Clipboard.SetText(this.Text); 
    } 

    public void PasteFromClipboard() 
    { 
     if (Clipboard.ContainsText()) 
     { 
      this.Text = Clipboard.GetText(); 
     } 
    } 

    #endregion 
} 
+0

Merci pour votre réponse. Le problème que j'ai, c'est que je veux pouvoir copier et coller entre différents contrôles. Donc, dans ma méthode pasteToolStripMenuItem_Click() par exemple, je dois obtenir le contrôle focalisé et ensuite passer par une grosse instruction if en fonction du type de contrôle (et aussi du type de données dans le presse-papiers) pour pouvoir gérer chaque cas. J'aimerais vraiment avoir chaque contrôle avec la copie et le collage. J'ai essayé de faire une superclasse abstraite pour le faire mais ça casse le concepteur de winforms. –

+0

voir mon code de mise à jour ci-dessous la ligne. Au lieu de convertir l'expéditeur, vous pouvez convertir le formulaire activeControl en l'interface ICopyPasteable. – serhio

+0

Je pense que cela peut être le chemin à parcourir, à la joie. –

0

Pour trouver le contrôle ciblé: ContainerControl.ActiveControl. Ensuite, selon le type de contrôle, vous pouvez définir une valeur (avec la valeur du presse-papiers).

+0

Merci, je suis déjà en mesure d'obtenir le contrôle ciblé, ma question est sur la façon dont je devrais organiser mon application. Il est assez moche d'avoir à faire un grand 'sinon' sur chaque type de contrôle, et cela signifie aussi que je dois avoir un cas pour des choses comme les TextBox, qui ont déjà la gestion du Presse-papiers. –

+0

Selon ce que vous comprenez sur laid, 1 fonction avec un commutateur/ifelse ou plusieurs fonctions pour plusieurs contrôles qui font la même chose. Je préférerais 1 fonction pour faire tous les cas. Si vous copiez une couleur, que ferait une zone de texte lorsqu'elle reçoit un collage? valeur hexadécimale pour la couleur ou quelque chose de différent. Je vous suggère de faire un schéma pour vous-même de ce que les contrôles devraient interagir les uns avec les autres. Si vous ne savez toujours pas quelle est la meilleure stratégie, affichez le schéma ici :) – RvdK

0

L'événement KeyUp a résolu mon problème! Événements KeyDown et KeyPress n'a pas attraper Ctrl + C pour la copie!

De Stack Overflow question Catching Ctrl + C in a textbox:

private void txtConsole_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == (Keys.C | Keys.Control)) 
    { 
     _consolePort.Write(new byte[] { 3 }, 0, 1); 
     e.Handled = true; 
    } 
} 
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace notep 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 

     } 

     private void b1_Click(object sender, RoutedEventArgs e)//copy 
     { 
      Clipboard.SetText(richTextBox1.Selection.Text); 
      richTextBox1.Selection.Text = string.Empty; 

     } 

     private void b2_Click(object sender, RoutedEventArgs e)//cut 
     { 
      Clipboard.SetText(richTextBox1.Selection.Text); 
     } 

     private void b3_Click(object sender, RoutedEventArgs e) 
     { 

     richTextBox1.Selection.Text =richTextBox1.Selection.Text + Clipboard.GetText();//paste 
     } 
    } 
} 
+0

Je pense que vous avez votre code "copier" et "couper" inversé. –

Questions connexes