2009-12-02 56 views
1

我正在使用Windows Forms在C#中编写一个小应用程序。我想让我的用户在应用程序周围复制和粘贴数据,并且有一些自定义控件,例如一个是颜色选择器。使用自定义控件复制/粘贴到Windows窗体中

某些默认控件(至少是文本框)已经具有复制和粘贴功能。我想和我的颜色选择器一样,并且还想在顶部的“编辑”菜单进行复制和粘贴。

目前,我不能看到如何在一个不错的方式做到这一点,我现在的粘性是赶按Ctrl +ç按Ctrl +V命令和菜单点击和通过使用一些Win32调用的函数来查找聚焦的控件,然后将数据从控件复制或粘贴到控件(根据聚焦控件的类型,使用大量的if声明)。

替代方法似乎是将密钥处理写入每个自定义控件,但使用此方法我不确定如何合并编辑菜单功能。

如何以优雅或更“标准”的方式做到这一点?

+0

不要也尝试* [代码。NET框架 - 剪切,复制,粘贴代码](http://www.eggheadcafe.com/software/aspnet/31867610/cut-copy-paste-code.aspx)*。 – 2009-12-02 10:26:03

+0

* [在Windows窗体应用程序中执行“剪切”,“复制”,“粘贴”菜单命令](http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/4654a0e3-bb68-494e -a1f2-03884a72f7d6 /)*与您的问题类似。只是检查出来.. – 2009-12-02 10:24:00

+0

谢谢,这似乎是在谈论实际使用剪贴板,我没有问题。我不知道TextBox.Copy(),但我试图得到的是一个更好的方式来复制和粘贴到自定义控件,因此他们响应键盘和菜单点击,但没有很多if语句或每个控制密钥处理代码。 – 2009-12-02 10:42:22

回答

3

最简单的方法是激活KeyPreview的形式,然后按照KeyDown事件中的逻辑。如果您在Windows应用程序的菜单有(由例如&编辑=>复制(粘贴))

对另一种方法是有用的。

启用该菜单中的键盘快捷键

// 
// 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"; 

所以,你有你的快捷方式复制粘贴。现在管理你的菜单点击

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; 
} 

当然,如果你想不显示给用户,你可以使你的菜单隐身。

============================================== ================================= UPDATE多个控件

代码:

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

感谢您的回复。我遇到的麻烦是我想能够在不同的控件之间复制和粘贴。所以在我的pasteToolStripMenuItem_Click()方法中,例如我必须获得集中的控制权,然后根据它是什么类型的控件(以及剪贴板中的数据类型)通过一个大的if语句,以便我可以处理每个案例。我真的很想让每个控件都处理复制和粘贴。我试图做一个抽象超类来做到这一点,但它打破了winforms设计器。 – 2009-12-02 12:24:23

+0

看到我的更新代码在下面的行。不用转换发件人,您可以将表单activeControl转换为ICopyPasteable接口。 – serhio 2009-12-02 13:25:25

+0

我想这可能是要走的路,欢呼。 – 2009-12-02 15:41:48

0

找到集中控制:ContainerControl.ActiveControl。然后根据控件的类型,可以设置一个值(使用剪贴板值)。

+0

谢谢,我已经能够获得重点控制,我的问题是关于如何组织我的应用程序。在每种类型的控件上做一个大的“if else”是非常丑陋的,这也意味着我必须有一个像TextBoxes这样的事情,它们已经有剪贴板管理。 – 2009-12-02 10:36:29

+0

取决于你对丑陋的理解,1个功能与开关/ ifelse或多个功能的多个控件做同样的事情。我宁愿1个函数来处理所有的情况。如果您复制一种颜色,文本框在接收粘贴时会做什么?颜色的十六进制值或不同的东西。我建议你为自己制定一个示意图,说明哪些控件应该相互交互。如果您仍然不知道最佳策略是什么,请在此处发布原理图:) – RvdK 2009-12-02 13:01:43

0

KeyUp事件解决了我的问题!事件KeyDownKeyPress没有捕获Ctrl + C for copy!

从堆栈溢出问题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

我认为你的“复制”和“剪切”代码是相反的。 – 2014-11-18 21:49:17

相关问题