2014-10-15 2 views
0

Я после некоторых мнений/советов, поскольку я довольно новичок в программировании на основе событий, а 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?

Если я беспокоюсь о чем-то, что не имеет значения, можете ли вы объяснить, почему? Похоже, что это плохая практика и что она будет использовать системные ресурсы (хотя бы немного), особенно учитывая, что подавляющее большинство времени, использующее эту программу, будет потрачено с помощью курсора внутри этого окна.

Я ценю и ввод, спасибо! Шон

+0

Несвязанный: если у вас есть фон для веб-разработки (или даже если вы этого не сделаете, tbh), вы можете захотеть взглянуть на WPF вместо winforms для. Net Windows UI. winforms - действительно старая технология, не рекомендованная для каких-либо новых проектов, только для поддержки устаревших приложений. Подход XAML + DataBinding в WPF гораздо ближе к веб-парадигме, и на сегодняшний день намного более эффективен, чем процедурный подход слишком много кодов для всех. –

+0

Кроме того, по первым 3 строкам вашего вопроса я сразу понял, что вы ищете «ListBox».Конечно, ListBox winforms совершенно бесполезен и не поддерживает какой-либо настройки, но в WPF поведение элемента управления полностью не зависит от его внешнего вида, и, таким образом, у вас может быть ListBox, который отображает поведение выбора (без необходимости реализации выбора поведение) и заставить его выглядеть сеткой с серией панелей или, фактически, тем, что вам нужно. –

ответ

1

Внесите selectingMode в качестве свойства и поставьте в сеттер a split.MouseMove += new MouseEventHandler(MouseMoved); или split.MouseMove -= new MouseEventHandler(MouseMoved); в зависимости от истины или false.

Кроме того, я не думаю, что это изменение необходимо по соображениям производительности.

+0

Спасибо! Кажется, что это действительно может сработать. Мне нужно пойти и посмотреть разницу между + = и - = –

+1

@SeanMissingham Он просто должен делать то, что вы хотели этого сделать. Добавьте слушателя к триггеру, если «Selected» включен и удаляет его, если он выключен. Но вы все равно должны взглянуть на теорию, стоящую за ней. ... Просто упомянуть об этом: конечно, вам нужно удалить строку 'split.MouseMove + = new MouseEventHandler (MouseMoved);' от конструктора. Удачи. – Fratyx

+0

Удивительный! Только совет, который я искал. Благодаря! –

1

Вы можете использовать другое событие, которое удовлетворяет ваше состояние:

SplitContainer Класс: MSDN SplitContainer события: OnMouseClick

попытаться подписаться на это событие, если вы хотите, чтобы выстрелить по щелчку только, если вы хотите отказаться от подписки на мероприятие, используйте тег - =.

+0

Спасибо за предложение! Я не понимал, что я действительно не объяснял, почему я подписываюсь на mousemove, но тем не менее, что Splitcontainers будет содержать WebControls, есть еще одна и та же проблема с запуском события гораздо чаще, чем это необходимо. Однако я рассмотрю отмену подписки, но не то, что я использовал. Еще раз спасибо :) –

+1

Добро пожаловать @SeanMissingham – DevEstacion

Смежные вопросы