Вам необходимо удалить base.RaiseEvent (e) из ВСЕХ частей вашего пользовательского элемента управления. Это является причиной переполнения стека.
Если вы наследуете от UserControl, события щелчка уже реализованы для вас. Вам НЕ нужно повторно внедрять. Вы МОЖЕТЕ иметь дело с ними, но, скорее всего, нет.
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
// handle the event if you need to do something with the data.
// this is not over-riding the event, this is attaching a custom handler to the event
this.gotLeftButtonDown = false;
this.movedAfterMouseDown = false;
}
Это не перевешивает событие. Это обработчик, когда событие возникает! Пользователи вашего элемента управления будут писать обработчики так же, как этот. Не переопределяйте это. Даже не обращайтесь с этим, если вам не нужно что-то делать с данными. Эти события уже написаны для вас.
Edit:
Хотя мой ответ был неправильным в том смысле, что он не устранил проблему, все же полезно понять, ПОЧЕМУ происходило исключение stackoverflow.
protected virtual void OnMouseClick(MouseButtonEventArgs e)
{
base.RaiseEvent(e);
/* this will raise the OnMouseLeftButtonUp event if the MouseButtonEventArgs
designates that it came from the MouseLeftButtonUp event.
That will then call the OnMouseLeftButtonUp because e.RoutedEvent equals
MouseLeftButtonUpEvent.
The accepted answer does the following, to stop OnMouseLeftButtonUp being
called again, and the whole process repeating itself in an infinite loop.
args.RoutedEvent = MouseClickEvent;
base.RaiseEvent(e); // No longer fires MouseLeftButtonUp, breaking cycle.
// Changes the event to be fired, avoiding the cycle of
// OnMouseLeftButtonUp -> OnMouseClick -> OnMouseLeftButtonUp etc
*/
}
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
base.OnMouseLeftButtonUp(e);
if (!this.movedAfterMouseDown)
{
OnMouseClick(e); // This will call OnMouseClick handler
}
this.gotLeftButtonDown = false;
this.movedAfterMouseDown = false;
}
Поток управления был:
- Пользователь генерирует MouseLeftButtonUpEvent
- OnMouseClick вызывается в обработчике OnMouseLeftButtonUp
- OnMouseClick вызывает событие MouseLeftButtonUp
- Перейти к 2.
Принятый ответ изменяется на:
- Пользователь генерирует MouseLeftButtonUpEvent
- OnMouseClick вызывается в обработчике OnMouseLeftButtonUp
- OnMouseClick изменяет перенаправленное событие на MouseClickEvent
- OnMouseClick вызывает MouseClickEvent
- Управление возобновляется
Это то, что я пытался объяснить в комментариях к другим ответам. Если я не был достаточно ясен, я прошу прощения за это. Я полагаю, что мы с Серхио были не синхронизированы, поскольку пытались объяснить причину стека переполнения стека, когда он искал исправление в коде. Поправь меня, если я ошибаюсь.