使用自定义控件复制/粘贴到Windows窗体中
我正在使用Windows Forms在C#中编写一个小应用程序。我想让我的用户在应用程序周围复制和粘贴数据,并且有一些自定义控件,例如一个是颜色选择器。使用自定义控件复制/粘贴到Windows窗体中
某些默认控件(至少是文本框)已经具有复制和粘贴功能。我想和我的颜色选择器一样,并且还想在顶部的“编辑”菜单进行复制和粘贴。
目前,我不能看到如何在一个不错的方式做到这一点,我现在的粘性是赶按Ctrl +ç和按Ctrl +V命令和菜单点击和通过使用一些Win32调用的函数来查找聚焦的控件,然后将数据从控件复制或粘贴到控件(根据聚焦控件的类型,使用大量的if
声明)。
替代方法似乎是将密钥处理写入每个自定义控件,但使用此方法我不确定如何合并编辑菜单功能。
如何以优雅或更“标准”的方式做到这一点?
最简单的方法是激活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
}
感谢您的回复。我遇到的麻烦是我想能够在不同的控件之间复制和粘贴。所以在我的pasteToolStripMenuItem_Click()方法中,例如我必须获得集中的控制权,然后根据它是什么类型的控件(以及剪贴板中的数据类型)通过一个大的if语句,以便我可以处理每个案例。我真的很想让每个控件都处理复制和粘贴。我试图做一个抽象超类来做到这一点,但它打破了winforms设计器。 – 2009-12-02 12:24:23
看到我的更新代码在下面的行。不用转换发件人,您可以将表单activeControl转换为ICopyPasteable接口。 – serhio 2009-12-02 13:25:25
我想这可能是要走的路,欢呼。 – 2009-12-02 15:41:48
找到集中控制:ContainerControl.ActiveControl
。然后根据控件的类型,可以设置一个值(使用剪贴板值)。
谢谢,我已经能够获得重点控制,我的问题是关于如何组织我的应用程序。在每种类型的控件上做一个大的“if else”是非常丑陋的,这也意味着我必须有一个像TextBoxes这样的事情,它们已经有剪贴板管理。 – 2009-12-02 10:36:29
取决于你对丑陋的理解,1个功能与开关/ ifelse或多个功能的多个控件做同样的事情。我宁愿1个函数来处理所有的情况。如果您复制一种颜色,文本框在接收粘贴时会做什么?颜色的十六进制值或不同的东西。我建议你为自己制定一个示意图,说明哪些控件应该相互交互。如果您仍然不知道最佳策略是什么,请在此处发布原理图:) – RvdK 2009-12-02 13:01:43
KeyUp事件解决了我的问题!事件KeyDown
和KeyPress
没有捕获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;
}
}
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
}
}
}
我认为你的“复制”和“剪切”代码是相反的。 – 2014-11-18 21:49:17
不要也尝试* [代码。NET框架 - 剪切,复制,粘贴代码](http://www.eggheadcafe.com/software/aspnet/31867610/cut-copy-paste-code.aspx)*。 – 2009-12-02 10:26:03
* [在Windows窗体应用程序中执行“剪切”,“复制”,“粘贴”菜单命令](http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/4654a0e3-bb68-494e -a1f2-03884a72f7d6 /)*与您的问题类似。只是检查出来.. – 2009-12-02 10:24:00
谢谢,这似乎是在谈论实际使用剪贴板,我没有问题。我不知道TextBox.Copy(),但我试图得到的是一个更好的方式来复制和粘贴到自定义控件,因此他们响应键盘和菜单点击,但没有很多if语句或每个控制密钥处理代码。 – 2009-12-02 10:42:22