Я пытаюсь создать собственный элемент управления WPF, в котором применяется TranslateTransform, основанный на двух двойных значениях (TranslateX, TranslateY), которые являются данными, привязанными к TranslateTransform, это прекрасно работает при использовании кнопок или полос прокрутки для манипулирования двумя двойными значениями, но я бы хотел, чтобы пользователи перетаскивали его в пользовательский элемент управления, чтобы перевести элементы управления внутри него.
Для этого я добавил обработчик PreviewMouseDown, Up и Move в свой пользовательский элемент управления. (Насколько я понимаю, я всегда должен получать события «предварительного просмотра», потому что они туннелируют снизу вниз, а не всплывают).
//Inside the constructor of the custom control
Mouse.AddPreviewMouseDownHandler(this, new MouseButtonEventHandler(MouseDown));
Mouse.AddPreviewMouseUpHandler(this, new MouseButtonEventHandler(MouseUp));
Mouse.AddPreviewMouseMoveHandler(this, new MouseEventHandler(MouseMoved));
События обрабатываются следующими методами:
private void OnMouseDown(object o, MouseEventArgs args)
{
Mouse.Capture(this, CaptureMode.Element);
prevMousePosition = args.GetPosition(this);
}
private void OnMouseUp(object o, MouseEventArgs args)
{
Mouse.Capture(this, CaptureMode.None);
}
private void OnMouseMoved(object o, MouseEventArgs args)
{
if (args.LeftButton == MouseButtonState.Pressed)
{
Vector change = prevMousePosition - args.GetPosition(this);
TranslateX += change.X;
TranslateY += change.Y;
prevMousePosition = args.GetPosition(this);
}
}
Однако метод OnMouseMoved вызывается только тогда, когда я лихорадочно перемещаю мышь, а не если я медленно перемещаю ее (что большинство людей будет делать при перетаскивании). Также (понятно), событие полностью прекращается, когда я выхожу за пределы пользовательского элемента управления, в то время как пользователи могут продолжать перетаскивать дальше, не перемещая свою мышь.
Итак, мой вопрос: как мне зафиксировать положение мыши и события ее перемещения таким образом, чтобы пользователи могли плавно перетаскивать данные внутри пользовательского элемента управления и продолжать перетаскивание, даже если их перетаскивание заставило мышь выйти за пределы пользовательского элемента управления
(Небольшое примечание: я все еще использую .NET 3.5)