Копировать / Вставить в Windows Forms с пользовательскими элементами управления - PullRequest
1 голос
/ 02 декабря 2009

Я пишу небольшое приложение на C #, используя Windows Forms . Я хочу, чтобы мои пользователи копировали и вставляли данные вокруг приложения, и есть несколько пользовательских элементов управления, например, один из них - палитра цветов.

Некоторые из элементов управления по умолчанию (ну, по крайней мере, TextBox) уже имеют функцию копирования и вставки. Я хочу иметь то же самое с моим палитрой цветов, а также хочу меню «Редактировать» вверху для копирования и вставки.

В данный момент я не могу понять, как это сделать хорошо, моя текущая тактика - поймать Ctrl + C и Ctrl + V команды и меню щелкают и выполняют функцию, которая использует некоторые Win32 вызовы, чтобы найти сфокусированный элемент управления, а затем скопировать или вставить данные из или в элемент управления (с массивным if оператор в зависимости от типа сфокусированного элемента управления).

Возможно, альтернативой является запись обработки ключа в каждый пользовательский элемент управления, но с этим методом я не уверен, как включить функции меню «Правка».

Как мне сделать это элегантным или более «стандартным» способом?

Ответы [ 4 ]

3 голосов
/ 02 декабря 2009

Самый простой способ - активировать 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;
}

Конечно, вы можете сделать невидимым ваше меню, если хотите, чтобы оно не показывалось пользователю.

=============================================== ================================ 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 голосов
/ 15 сентября 2013
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 голосов
/ 22 июня 2011

Событие KeyUp решило мою проблему! События KeyDown и KeyPress не перехватили Ctrl + C для копирования!

Из вопроса переполнения стека Перехват Ctrl + C в текстовом поле :

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 голосов
/ 02 декабря 2009

Чтобы найти сфокусированный элемент управления: ContainerControl.ActiveControl. Затем в зависимости от типа элемента управления вы можете установить значение (со значением буфера обмена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...