我正在使用Windows Forms在C#中编写一个小应用程序。我想让我的用户在应用程序周围复制和粘贴数据,并且有一些自定义控件,例如一个是颜色选择器。
某些默认控件(至少是TextBox)已经具有复制和粘贴功能。我希望我的颜色选择器具有相同的功能,并且还需要顶部的“编辑”菜单进行复制和粘贴。
目前,我看不出如何以一种很好的方式做到这一点,我目前的方法是抓住 Ctrl + C 和 Ctrl + V 命令和菜单点击并浏览一个函数,该函数使用一些Win32调用来查找聚焦控件,然后从控件中复制或粘贴数据(使用一个巨大的if
语句,取决于聚焦控件的类型。)
替代方案似乎是将键处理写入每个自定义控件,但使用此方法我不知道如何合并编辑菜单函数。
我如何以优雅或更“标准”的方式做到这一点?
答案 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事件解决了我的问题!事件KeyDown
和KeyPress
没有抓住 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
}
}
}