в принципе, у вас нет решения, кроме как использовать TemplateColumn и управлять каждым mouseEvent самостоятельно.
Объяснение:
click = mouseDown
+ MouseUp
, вправо.
поэтому ваша кнопка должна иметь возможность получить mouseDown + событие MouseUp.
НО ...
по умолчанию, DataGrid wpf имеет строки, обрабатывающие событие MouseDown
, чтобы выбрать тот, который вы делаете на mouseDown
(для подтверждения: mouseDown
в ячейке и удерживая кнопку мыши нажатой, вы увидите что строка выбрана ДО вы отпустите кнопку).
Таким образом, MouseDownEvent
обрабатывается до того, как достигает кнопки, что не позволяет вам использовать событие Click
для кнопки
Microsoft в своем документе сообщает нам, что в таких случаях мы должны обращаться к событию Preview , но это не может применяться к событию click, поскольку вы не можете получить previewClickEvent.
Таким образом, единственное решение, которое я вижу для вас, - это слушать как PreviewMouseDown
и PreviewMouseUp
на вашей кнопке, так и имитировать нажатие от них самостоятельно
что-то вроде этого:
Button myButton = new Button();
bool mouseLeftButtonDownOnMyButton;
myButton.PreviewMouseLeftButtonDown += (s, e) => { mouseLeftButtonDownOnMyButton = true; };
myButton.PreviewMouseLeftButtonUp += (s, e) => {
if (mouseLeftButtonDownOnMyButton)
myButton.RaiseEvent( new RoutedEventArgs(Button.ClickEvent,myButton));
mouseLeftButtonDownOnMyButton = false;
};
myButton.Click += myButtonCLickHandler;
(конечно, вам нужно перевести это в шаблоне xaml)
NB: это не завершено, вы должны также позаботиться о случаях, когда пользователь нажимает кнопку мыши на кнопке, но перемещает мышь из кнопки перед выполнением операции мыши (в случае, если вы должен сбросить флаг mouseLeftButtonDownOnMyButton
). Вероятно, лучшим способом было бы сбросить флаг в обычном mouseUpEvent (например, на уровне окна) вместо кнопки.
Редактировать: приведенный выше код позволяет вам также управлять событием Click и иметь только один код как для реальных, так и для имитируемых событий click (отсюда и использование метода RaiseEvent), но если вы не В этом нет необходимости, вы можете, конечно, напрямую поместить свой код в раздел PreviewMouseUp.