Перемещение кнопок на холсте - PullRequest
3 голосов
/ 18 октября 2011

Следующий код должен перемещать элементы UIE на холсте, когда на них наводит курсор мыши, и пользователь нажимает Ctrl.

void keydown(Object sender, KeyEventArgs e)
        {
            if (e.Key == Key.LeftCtrl || e.Key == Key.RightCtrl)
            {
                control++;
                if (control == 1)
                {
                    drag = true;
                    elem = (UIElement)Mouse.DirectlyOver;
                }
                else
                    drag = false;
                control %= 2;
            }
        }

        void mousemove(object sender, MouseEventArgs e)
        {
            Point p = e.GetPosition(canvas);
            if (drag)
            {
                if (elem == null) return;
                //Canvas.SetLeft(myButton, p.X);  <-- this works, but then why doesn't it work when I generalize it?
                Canvas.SetLeft(elem, p.X);
                Canvas.SetTop(elem, p.Y);
            }
        }

Любой Shapes компонент, например Прямоугольники будут двигаться, когда я наведу на них курсор мыши и нажму на элемент управления ... Но это не работает с кнопками, текстовыми полями, текстовыми окнами и т. Д. Кто-нибудь может объяснить?

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Документация для Mouse.DirectlyOver гласит:

Элементы управления могут состоять из нескольких элементов.DirectlyOver сообщает о конкретном элементе в составном элементе управления, на котором находится указатель мыши, а не сам элемент управления.Например, в зависимости от того, над какой частью Button находится указатель, свойство DirectlyOver может сообщать TextBox свойства Content или ButtonChrome.

Другими словами: кнопка состоит из несколькихподэлементы, такие как ButtonChrome и TextBlock (обычно это не TextBox - я думаю, что это опечатка на странице MSDN).Когда вы вызываете Mouse.DirectlyOver, вы, вероятно, получаете один из этих элементов, а не Button.

Поскольку эти элементы не связаны с Canvas (они связаны с чем-то в шаблоне элемента управления Button,скорее всего Grid), установка свойств, связанных с Canvas.Left и Canvas.Top, не будет иметь никакого эффекта.

Возможно, вы захотите пройтись по визуальному дереву (используя VisualTreeHelper.GetParent ) доВы найдете то, что вас интересует, перетаскивая.Как вы определяете, интересуетесь ли вы тем или иным элементом, зависит от вас.Вы можете идти до тех пор, пока не найдете что-то, что связано с вашим Canvas, или вы можете просто пойти, пока не найдете что-то, относящееся к одному из заданных типов типов (остановка, когда вы найдете что-то, что происходит от Control, может стать подходящим местом для запуска).

0 голосов
/ 18 октября 2011

Я предполагаю, что эти события поглощены реализацией элементов управления, которые не работают.

Я сейчас не за своим компьютером, но разве нет события previewmousemove? Попробуйте использовать это?

Обновление: поцарапайте это!

Просто используйте e.Souce. Источник события предназначен для того элемента, который вас может заинтересовать. Вам нужно привести его к UIElement, но я уверен, что это сработает.

...