powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Перетаскивание кнопки по окну - точка захвата с погрешностью
5 сообщений из 5, страница 1 из 1
Перетаскивание кнопки по окну - точка захвата с погрешностью
    #39638700
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Нужно реализовать перетаскивание кнопки мышкой по окну.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
        private void c_MouseDown(object sender, System.Windows.Input.MouseEventArgs mevent)
        {
            IsDragMode = true;
        }

        private void c_MouseUp(object sender, System.Windows.Input.MouseEventArgs mevent)
        {
            IsDragMode = false;
        }

        private void c_MouseMove(object sender, System.Windows.Input.MouseEventArgs mevent)
        {
            if (IsDragMode)
            {
                System.Windows.Controls.Button c = sender as System.Windows.Controls.Button;

                TranslateTransform transform = new TranslateTransform();
                transform.X = Mouse.GetPosition(MainGrid).X;
                transform.Y = Mouse.GetPosition(MainGrid).Y;
                c.RenderTransform = transform;
            }
        }



Создание кнопки:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
            System.Windows.Controls.Button b = new System.Windows.Controls.Button();
            b.Width = 800;
            b.Height = 500;
            b.Margin = new Thickness(20, 20, 20, 20);
            MainGrid.Children.Add(b);
            b.PreviewMouseDown += c_MouseDown;
            b.PreviewMouseMove += c_MouseMove;
            b.PreviewMouseUp += c_MouseUp;



Работает, но при нажатии мышки кнопка смещается относительно точки захвата.

Пробовал сделать коррекцию:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
                TranslateTransform transform = new TranslateTransform();
                transform.X = Mouse.GetPosition(MainGrid).X;
                transform.Y = Mouse.GetPosition(MainGrid).Y;
                TranslateTransform transform2 = new TranslateTransform();
                transform2.X = Mouse.GetPosition(c as UIElement).X;
                transform2.Y = Mouse.GetPosition(c as UIElement).Y;
                transform.X += transform2.X;
                transform.Y += transform2.Y;
                c.RenderTransform = transform;



В этом случае кнопка мерцает и дёргается.
...
Рейтинг: 0 / 0
Перетаскивание кнопки по окну - точка захвата с погрешностью
    #39638714
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
задайте кнопке свойство SnapsToDevicePixels=True
либо используйте GuideLines, если содержимое сложное.
...
Рейтинг: 0 / 0
Перетаскивание кнопки по окну - точка захвата с погрешностью
    #39638722
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще по уму лучше делать не так, сделать контрол, аналогичный контролу Thumb в котором уже реализовано перетаскивание, добавить его в шаблон кнопки и использовать.
Как мне кажется.
Использование RenderTransform не будет вызвать пересчет макета, для этого есть LayoutTransform, стоит учитывать это при проектировании контрола.
При реализации управления с помощью мышки связанного с зажатием кнопки (перетаскивание, рисование, выделение) и других лучше это реализовывать через захват мышки. Захват мышки элементом управления позволяет ему и только ему получать координаты мышки, состояние её кнопок независимо от всего остального.
Естественно нужно учитывать, что и другие элементы управления могут захватывать мышку, но проблем не будет, если они находятся в 1 дереве. Захват мышки можно использовать через менеджер мышки bool Mouse.Capture(myControl), Mouse.Capture(null) или через сам элемент управления bool CaptureMouse(), ReleaseMouseCapture();
В менеджере можно так же посмотреть какой элемент управления захватил мышку, во время отладки это может сильно помочь во время конфликта. И Mouse.Capture имеет дополнительный параметры.
...
Рейтинг: 0 / 0
Перетаскивание кнопки по окну - точка захвата с погрешностью
    #39638754
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesзадайте кнопке свойство SnapsToDevicePixels=True
либо используйте GuideLines, если содержимое сложное.
Ничего не меняется.

А через Mouse.Captur он будет сам рассчитывать корректирование точки нажатия мыши относительно границ контрола?
...
Рейтинг: 0 / 0
Перетаскивание кнопки по окну - точка захвата с погрешностью
    #39640453
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, решилось - надо было учитывать Margin элемента.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Перетаскивание кнопки по окну - точка захвата с погрешностью
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]