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

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

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

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

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

Спасибо

7.05.2009 23:24:41
2 ОТВЕТА
РЕШЕНИЕ

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);
}
3
8.05.2009 00:10:01

Вы можете попытаться установить для свойства 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" рядом с именем вашего пункта меню), чтобы это работало, иначе ваш пункт меню будет взломать ход клавиш.

0
8.05.2009 15:27:42