1

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

一些默认控件(至少是 TextBox)已经具有复制和粘贴功能。我想用我的颜色选择器做同样的事情,还想在顶部有一个“编辑”菜单来复制和粘贴。

目前,我看不出如何以一种好的方式做到这一点,我目前的策略是捕捉Ctrl+CCtrl+V命令和菜单点击,并通过一个函数,该函数使用一些Win32调用来找到焦点控件,然后从控件复制或粘贴数据(if根据焦点控件的类型使用大量语句)。

另一种方法似乎是将键处理写入每个自定义控件,但是使用这种方法我不确定如何合并编辑菜单功能。

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

4

4 回答 4

3

最简单的方法是在表单中激活KeyPreview,然后在KeyDown事件中遵循逻辑。

但是另一种方法可能很有用:
如果您的 win 应用程序中有一个菜单(例如,通过 &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
}
于 2009-12-02T11:52:49.767 回答
0

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

于 2009-12-02T10:24:41.793 回答
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;
    }
}
于 2011-06-22T09:04:59.227 回答
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
        }
    }
}
于 2013-09-15T14:34:50.130 回答