Я борюсь с проблемой, которая сводит меня с ума.MouseLeftButtonDown обработчик никогда не назывался
Вот мой XAML код (упрощенно):
<UserControl>
<Canvas>
<Grid>
<ScrollViewer>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical">
<Canvas>
<Button Name="theButton" Click="theButton_Click"></Button>
<ComboBox Name="theCombo" SelectionChanged="theCombo_SelectionChanged"></ComboBox>
</Canvas>
</StackPanel>
</StackPanel>
</ScrollViewer>
</Grid>
</Canvas>
</UserControl>
В конструкторе этого UserControl:
AddHandler(MouseLeftButtonDownEvent, new MouseButtonEventHandler(UserControl_MouseDown), true);
мне нужно, чтобы захватить щелчков мыши для моего UserControl (я должен нарисовать прямоугольник выбора с помощью мыши над ним). Поэтому я использую AddHandler(), и я указываю «true», чтобы я мог подключить MouseLeftButtonDownEvent, даже если он был обработан моей кнопкой «TheButton» (потому что, когда нажата кнопка, она отмечает свойство обработанного события как true, как MSDN говорит)
Когда я нажимаю внутри своего UserControl, обычно вызывается моя функция UserControl_MouseDown. Но когда я нажимаю на свою кнопку, связанный обработчик («theButton_Click») никогда не вызывается. То же самое для события SelectionChanged моего ComboBox: его обработчик никогда не вызывается.
Я использовал инструмент Snoop для просмотра маршрутизации событий, и кажется, что это нормально: моя кнопка ловит MouseDown, а затем устанавливает свойство True its Handled. Но код никогда не доходит до обработчика.
Если я отменил событие для своего UserControl, все в порядке. Я попытался с PreviewMouseDown для кнопки. Он работает, но я не могу использовать его для своего ComboBox.
У вас есть ключ к решению этой проблемы и заставить мой UserControl и мою Button и ComboBox называть их соответствующими обработчиками?
Спасибо за вашу помощь
редактировать: код обработчика событий моей UserControl в
private void UserControl_MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left && !_isMoving)
{
_isLeftMouseButtonDownOnWindow = true;
_origMouseDownPoint = e.GetPosition(this);
this.CaptureMouse();
e.Handled = true;
}
}
MSDN предупреждает об этом. Что вы на самом деле делаете в обработчике событий UserControl? Как вы даже различаете клик, который должен просто запускать событие Click кнопки против того, которое должно начинать рисовать прямоугольник? –
@HansPassant: Я редактировал свой вопрос с помощью обработчика UserControl. Я различаю оба случая с булевым (_isMoving) Можете ли вы дать мне ссылку MSDN относительно этого? – Harkonnen