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