使用自定义控件在Windows窗体中复制/粘贴

时间:2009-12-02 10:18:41

标签: c# .net winforms copy paste

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

某些默认控件(至少是TextBox)已经具有复制和粘贴功能。我希望我的颜色选择器具有相同的功能,并且还需要顶部的“编辑”菜单进行复制和粘贴。

目前,我看不出如何以一种很好的方式做到这一点,我目前的方法是抓住 Ctrl + C Ctrl + V 命令和菜单点击并浏览一个函数,该函数使用一些Win32调用来查找聚焦控件,然后从控件中复制或粘贴数据(使用一个巨大的if语句,取决于聚焦控件的类型。)

替代方案似乎是将键处理写入每个自定义控件,但使用此方法我不知道如何合并编辑菜单函数。

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

4 个答案:

答案 0 :(得分:3)

最简单的方法是在表单中激活KeyPreview,然后按照KeyDown事件中的逻辑进行操作。

但另一种方法可能很有用:
如果您在获胜应用程序中有一个菜单(例如& Edit => Copy(Paste))。

为菜单启用键盘快捷键

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

当然,如果您不希望向用户显示,您可以隐藏菜单。

=============================================== ================================ 的更新

多个控件的代码:

    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
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

KeyUp事件解决了我的问题!事件KeyDownKeyPress没有抓住 Ctrl + C 进行复制!

来自Stack Overflow问题 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;
    }
}

答案 3 :(得分: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
        }
    }
}