Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 21

Некорректно перемещается WPF-окно по экрану

05.10.2016, 15:48. Показов 2079. Ответов 2
Метки wpf (Все метки)

Студворк — интернет-сервис помощи студентам
Захотел я изменить стандартное окно на своё кастомное. Т.е., убрать заголовок вверху окна (там где крестик, кнопка свернуть, свернуть в окно). Свойство WindowStyle установил в None. Встретил проблему, что ведь окошко надо элементарно таскать по экрану, что стало невозможным после того, как я убрал заглавную панель.

Итак, кода я привожу ниже, лучше их запустить и потаскать окно по экрану. Оно-то работает, если небыстро тянуть. Если потянуть резко, то курсор обгоняет окошко и дальше творится галиматья.

Как это исправить? Пробовал через таймер, но возникают другого рода приколы, пробовал добавить аналог ф-ции Application.DoEvent(), но проблема остается по-прежнему.

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Window x:Class="QuickWpfApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" WindowStyle="None" ResizeMode="NoResize">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="10*"/>
            <RowDefinition Height="90*"/>
        </Grid.RowDefinitions>
        
        <DockPanel Grid.Row="0" Background="#FF92B7F7" MouseDown="DockPanel_MouseDown" MouseMove="DockPanel_MouseMove" MouseUp="DockPanel_MouseUp" />
        <DockPanel Grid.Row="1" Background="#FFF7B792" MouseDown="DockPanel_MouseDown" MouseMove="DockPanel_MouseMove" MouseUp="DockPanel_MouseUp" />
    </Grid>
</Window>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace QuickWpfApplication
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        bool isMoving = false;
        Point CursorToScreenOldPosition, WindowOldPosition;
 
        private void DockPanel_MouseDown(object sender, MouseButtonEventArgs e)
        {
            isMoving = true;
            WindowOldPosition = new Point(this.Left, this.Top);
            CursorToScreenOldPosition = this.PointToScreen(Mouse.GetPosition(this));
        }
 
        private void DockPanel_MouseUp(object sender, MouseButtonEventArgs e)
        {
            isMoving = false;
        }
 
        private void DockPanel_MouseMove(object sender, MouseEventArgs e)
        {
            if (isMoving)
            {
                Point CursorToScreenPosition, delta;
 
                //позиция курсора относительно экрана
                CursorToScreenPosition = this.PointToScreen(Mouse.GetPosition(this));
 
                //delta - на сколько пикселей сместился курсор (т.е., на сколько нам надо передвинуть окно)
                delta = new Point(CursorToScreenPosition.X - CursorToScreenOldPosition.X,
                                  CursorToScreenPosition.Y - CursorToScreenOldPosition.Y);
 
                //собственно, передвигаем окно
                this.Left = WindowOldPosition.X + delta.X;
                this.Top = WindowOldPosition.Y + delta.Y;
            }
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.10.2016, 15:48
Ответы с готовыми решениями:

Звездочка перемещается по экрану при нажатии стрелок на клавиатуре
Помогите пожалуйста решить такую задачу. С ассемблером чет туго.. В центре экрана печатается звездочка. С помощью клавиш-стрелок можно...

Круг перемещается по экрану с помощью клавиш управления курсора
Круг передвигается по экрану с помощью ←,· *, ↓, →. При нажатии клавиши «пробел» меняется стиль заполнения случайным образом. При...

Не перемещается окно
Перетащила окно программы на край экрана и оно там зависло. Ярлыки отодвинулись. Когда закрываю окно, ярлыки становятся на свое место....

2
Эксперт .NET
 Аватар для novikov.ea
1857 / 1363 / 429
Регистрация: 10.06.2011
Сообщений: 2,136
05.10.2016, 16:42
Цитата Сообщение от White_Lord Посмотреть сообщение
Если потянуть резко, то курсор обгоняет окошко и дальше творится галиматья
Чтобы курсор "не слетал" нужно вначале захватить мышь над элементом, используя метод Mouse.Capture. Но вообще, вы пилите велосипед, так как чтобы начать перемещение окошка, достаточно вызвать у окна метод DragMove(). И вся ваша проблема решена)
1
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
06.10.2016, 01:08
Использование PointToScreen выглядит подозрительно.
Попробуйте использовать WinAPI функцию получения экранных координат, которая работает без посредников.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/// <summary>
/// Struct representing a point.
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
    public int X;
    public int Y;
 
    public static implicit operator Point(POINT point)
    {
        return new Point(point.X, point.Y);
    }
}
 
/// <summary>
/// Retrieves the cursor's position, in screen coordinates.
/// </summary>
/// <see>See MSDN documentation for further information.</see>
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out POINT lpPoint);
 
public static Point GetCursorPosition()
{
    POINT lpPoint;
    GetCursorPos(out lpPoint);
    //bool success = User32.GetCursorPos(out lpPoint);
    // if (!success)
 
    return lpPoint;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2016, 01:08
Помогаю со студенческими работами здесь

Перемещается ли окно
Возможно ли, имея HWND определить, перемещает ли пользователь окно в данный момент? Т.е. у меня некоторый код должен срабатывать, только...

Дочернее окно не перемещается
При выборе определённого пункта меню, должно быть создано новое дочернее окно. Окно открывается, но не перемещается. Код: #include...

wpf ScrollViewer + StackPanel не перемещается влево, вправо, вверх, вниз
в wpf ставлю ScrollViewer в него StackPanel StackPanel постояно центрируется хочу переместить StackPanel например влево что...

Окно браузера перемещается вверх.
Google chrome иногда повисает и как бы перемещается вверх за рамки экрана, а внизу остается белая линия, через 20-30 сек все приходит в...

При сворачивании сайтав окно строка поиска перемещается на строку выше
При сворачивании сайта в окно строка поиска перемещается на строку выше как это исправить вот код &lt;div class=&quot;head-contact ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru