Я работаю над приложением WinForms. Во многих случаях мне нужно отображать новый экран в небольшой области просмотра, поэтому я использую панели. По сути, я наследую от панели, выставляю любые свойства для нужной мне информации из панели, все, что должно происходить для отображения информации на панели, происходит в собственном коде позади. Эти панели всегда будут полностью закреплены на одном родительском элементе управления (основной форме).
Я создал универсальный метод для отображения этих панелей:
private static T ShowPanel<T>(Control parent, params object[] parameters) where T: Panel
{
T panelToShow = (T)Activator.CreateInstance(typeof(T), parameters);
parent.Controls.Add(panelToShow);
panelToShow.Dock = DockStyle.Fill;
panelToShow.BringToFront();
panelToShow.Show();
return panelToShow;
}
Я использую это так, но я знаю, что должен быть лучший способ обработать подписку на событие.
private void ShellButton_Click(object sender, EventArgs e)
{
if (CurrentSelectedSite == null)
{
AlertSelectSite();
return;
}
SystemViewPanel panel = ShowPanel<SystemViewPanel>(this, CurrentSelectedSite.Systems);
panel.SystemsListbox.DoubleClick += new EventHandler(ShellAccessSystemSelected);
}
Есть несколько кнопок, которые делают разные вещи. Если на сайте имеется несколько систем, отображается SystemViewPanel, чтобы выбрать систему для выполнения действия. Теперь я должен подписаться на другой именованный обработчик событий, чтобы указать, какое действие я хочу выполнить, поэтому код моей основной формы становится беспорядочным (т.е. ShellAccessSystemSelected, DownloadFileSystemSelected, ViewSystemSystemSelected и т. Д.).
Редактировать
Я думаю, что можно обобщить тот факт, что я покажу панель, которая позволяет пользователю выбирать систему для большинства инструментов в моем приложении. Однако для каждого отдельного инструмента требуется другое действие в зависимости от инструмента, который инициировал создание SystemViewPanel.