2013-11-12 4 views
2

Я борюсь с проблемой, которая сводит меня с ума.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; 
      } 
     } 
+0

MSDN предупреждает об этом. Что вы на самом деле делаете в обработчике событий UserControl? Как вы даже различаете клик, который должен просто запускать событие Click кнопки против того, которое должно начинать рисовать прямоугольник? –

+0

@HansPassant: Я редактировал свой вопрос с помощью обработчика UserControl. Я различаю оба случая с булевым (_isMoving) Можете ли вы дать мне ссылку MSDN относительно этого? – Harkonnen

ответ

1

Проблема решена после c опировать/вставки кода моего проводника ... удалив эту строку:

this.CaptureMouse(); 

Это было так очевидно ... Моя плохая

+0

У всех нас есть такие моменты. Надеюсь, кто-то приходит и видит, что произошло, и имеет решение для себя. – MetalPhoenix

0

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

но вы можете просто поймать его перед кнопкой:

AddHandler(PreviewMouseLeftButtonDownEvent, new MouseButtonEventHandler(UserControl_MouseDown), true);