Я после некоторых мнений/советов, поскольку я довольно новичок в программировании на основе событий, а C# - из происхождения веб-разработки.Прослушивание событий только при определенных обстоятельствах
В настоящее время я делаю программу в C#/Winforms с серией SplitContainer
элементов управления на основной форме. Я хочу разрешить пользователю эффективно выбирать группу из них, скажем, любые 3 из 8 (не ограничиваясь этим). Чтобы начать их выбирать, пользователь нажмет кнопку, и программа перейдет в режим выбора, и в это время, если пользователь нажмет на элемент управления, цвет его изменится, указывая, что он выбран.
На этом этапе я сделал это хорошо, но я считаю, что он не очень эффективен в обнаружении событий MouseMove. Я связал событие MouseMove с SplitContainer, и внутри этого события программа обнаруживает, находимся ли мы в режиме выбора. Если это так, и пользователь нажимает, измените цвет. Если не в режиме выбора, тогда он ничего не сделает.
Мое беспокойство заключается в том, что каждый раз, когда пользователь перемещает курсор над элементом управления, это событие срабатывает и обнаруживает, включен ли режим выбора. Я чувствую, что это должно быть наоборот; только в режиме выбора такое событие даже прослушивается.
Вот некоторые вырезы, чтобы объяснить, что у меня есть на данный момент.
public bool selectingMode = false;
public Form(){
SplitContainer split = new SplitContainer();
split.MouseMove += new MouseEventHandler(MouseMoved);
this.Controls.Add(split);
}
void MouseMoved(object sender, MouseEventArgs e){
if(selectingMode){
//change color of split
}
}
Как уже упоминалось, что метод MouseMoved() вызывается каждый раз, когда пользователь перемещает их курсор над этим элементом управления, а затем это только действия что-то, если это в selectingMode. Есть ли способ отменить это? Вызывать это событие только при выбореMode?
Если я беспокоюсь о чем-то, что не имеет значения, можете ли вы объяснить, почему? Похоже, что это плохая практика и что она будет использовать системные ресурсы (хотя бы немного), особенно учитывая, что подавляющее большинство времени, использующее эту программу, будет потрачено с помощью курсора внутри этого окна.
Я ценю и ввод, спасибо! Шон
Несвязанный: если у вас есть фон для веб-разработки (или даже если вы этого не сделаете, tbh), вы можете захотеть взглянуть на WPF вместо winforms для. Net Windows UI. winforms - действительно старая технология, не рекомендованная для каких-либо новых проектов, только для поддержки устаревших приложений. Подход XAML + DataBinding в WPF гораздо ближе к веб-парадигме, и на сегодняшний день намного более эффективен, чем процедурный подход слишком много кодов для всех. –
Кроме того, по первым 3 строкам вашего вопроса я сразу понял, что вы ищете «ListBox».Конечно, ListBox winforms совершенно бесполезен и не поддерживает какой-либо настройки, но в WPF поведение элемента управления полностью не зависит от его внешнего вида, и, таким образом, у вас может быть ListBox, который отображает поведение выбора (без необходимости реализации выбора поведение) и заставить его выглядеть сеткой с серией панелей или, фактически, тем, что вам нужно. –