Как обработать копирование для нескольких элементов управления при добавлении краткой клавиши в пункт меню?

StackOverflow https://stackoverflow.com/questions/837545

  •  10-07-2019
  •  | 
  •  

Вопрос

Если я это сделаю не создайте пункт меню "Правка-> Копировать" и назначьте ему сочетание клавиш "CTRL + C", затем я могу выбрать элемент управления (RichTextBox, DataGridView и т.д.) и нажать "CTRL + C", а сам элемент управления обработает копирование.Я могу скопировать текст и вставить его в блокнот и т.д..

Теперь на протяжении всей моей формы у меня есть много элементов управления.Но у меня есть пользовательский элемент управления, для которого я хочу пояснить, что я обрабатываю функциональность копирования.Поэтому я добавил короткую клавишу CTRL + C в меню Правка-> Копировать, и по умолчанию для нее установлено значение Включено.

Теперь мне нужно реализовать обработчик событий для события "click" в этом пункте меню.Если я явно введу код для обработки копии, то это сработает:

public void menuEditCopy_Click(object sender, EventArgs e)
{
    myCustomControl.Copy();
}

Однако теперь Копирование не работает ни с каким другим типом элемента управления.Моим первым побуждением было определить тип элемента управления, который имеет фокус, и реализовать ограниченный набор кода копирования для каждого из них:

public void menuEditCopy_Click(object sender, EventArgs e)
{
    if (this.ActiveControl is MyCustomControl)
    {
        ((MyCustomControl)this.ActiveControl).Copy();
    }
    else if (this.ActiveControl is RichTextBox)
    {
        ((RichTextBox)this.ActiveControl).Copy();
    }
}

и т.д...

Однако мои элементы управления добавлены в SplitContainer, и отладка показывает, что это так.ActiveControl установлен для экземпляра splitcontainer, а не для элемента управления, хотя я знаю, что этот элемент управления выбран.

Итак, моя последняя мысль - буквально проверить, есть ли у каждого элемента управления фокус:

public void menuEditCopy_Click(object sender, EventArgs e)
{
    if (myCustomControl.Focused)
    {
        myCustomControl.Copy();
    }
    else if (richTextBox1.Focused)
    {
        richTextBox1.Copy();
    }
}

Я хотел бы избежать этого, если возможно, это множество элементов управления, и если я добавлю новый элемент управления, мне нужно будет его обновить.Есть ли лучший способ сделать это?

Спасибо

Это было полезно?

Решение

A SplitContainer орудия труда ContainerControl, так что вы могли бы проверить наличие любого из них и найти его ActiveControl вместо этого. ContainerControl это базовый класс, поэтому я бы пошел на это - вы могли бы использовать и другой тип контейнера:

private void DoCopy(Control control)
{
    if(control is ContainerControl)
        DoCopy(control.SelectedControl);
    else if(control is MyCustomControl)
        ((MyCustomControl)control).Copy();
    else if(control is RichTextBox)
        ((RichTextBox)control).Copy();
    else
        throw new NotSupportedException("The selected control can't copy!");
}

void menuEditCopy_Click(object sender, EventArgs e)
{
    DoCopy(this.ActiveControl);
}

Другие советы

Вы могли бы попробовать присвоить свойству KeyPreview вашей формы значение true .Затем вы могли бы настроить обработчик для события KeyDown формы, который выглядел бы следующим образом:

private void Form_KeyDown(object sender, KeyEventArgs e)
{
    if(e.Modifiers == Keys.Control && e.KeyCode == Keys.C)
    {
        if (ActiveControl.GetType() == typeof(MyCustomControl))
        {
            ((MyCustomControl)ActiveControl).Copy();
            e.Handled = true;
        }
    }
}

Здесь вы указываете, что вы обработали событие Ctrl-C, установив для свойства event args Handled значение true.В противном случае, если вы оставите значение false, нажатие клавиши Ctrl-C будет обрабатываться как обычно каждым отдельным элементом управления.

Поскольку мы установили для KeyPreview значение true, обработчик формы видит каждое нажатие клавиши перед любым другим элементом управления, который она содержит, и может решить, обрабатывать ли нажатие клавиши самостоятельно или же разрешить обработку таким же образом, как если бы форма никогда не просматривала ее.

Я также думаю, что было бы необходимо удалить сокращенную клавишу из вашего пункта меню (хотя вы все еще можете вручную поместить текст "Ctrl + C" рядом с названием вашего пункта меню), чтобы это сработало, иначе ваш пункт меню перехватит нажатие клавиши.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top