Как работать с копией для нескольких элементов управления при добавлении ShortcutKey к пункту меню? - PullRequest
1 голос
/ 08 мая 2009

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

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

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

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, и отладка показывает, что this.ActiveControl установлен на экземпляр splitcontainer, а не на элемент управления, даже если я знаю, что этот элемент управления выбран.

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

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

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

Спасибо

Ответы [ 2 ]

3 голосов
/ 08 мая 2009

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);
}
0 голосов
/ 08 мая 2009

Вы можете попробовать установить для свойства 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, установив для свойства args Event Handled значение true. Иначе, если вы оставите значение false, нажатие клавиши Ctrl-C будет обрабатываться, как обычно, каждым отдельным элементом управления.

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

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

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