сделать всплывающее окно WPF не привязанным к экрану - PullRequest
7 голосов
/ 31 октября 2009

Поведение всплывающего окна по умолчанию состоит в том, что если оно расположено там, где оно будет выходить за край экрана, всплывающее окно само переместится. Есть ли способ отключить это поведение?

У меня есть всплывающее окно, которое пользователь может перетаскивать по экрану. Однако, когда он достигает краев, он застревает. Он застревает на краю и остается там до тех пор, пока мышь не утащит далеко от края. Кроме того, у меня есть два монитора, и когда всплывающее окно перетаскивается на край, я разделяю мерцание двух общих мониторов. Всплывающее окно мигает между двумя мониторами.

Ответы [ 2 ]

3 голосов
/ 17 февраля 2012

Просто используйте Interop для перемещения ваших всплывающих окон (перетащите их)

Вот код для большого пальца, который будет отслеживать процесс перетаскивания

регион Thumb

    private Thumb mThumb = null;
    public Thumb Thumb
    {
        get { return mThumb; }
        set
        {
            if (mThumb != value)
            {
                if (mThumb != null)
                {
                    DetachThumb();
                }
                mThumb = value;
                if (mThumb != null)
                {
                    AttachThumb();
                }
            }
        }
    }

    private void AttachThumb()
    {
        Thumb.DragStarted += Thumb_DragStarted;
        Thumb.DragDelta += Thumb_DragDelta;
        Thumb.DragCompleted += Thumb_DragCompleted;
    }

    private void DetachThumb()
    {
        Thumb.DragStarted -= Thumb_DragStarted;
        Thumb.DragDelta -= Thumb_DragDelta;
        Thumb.DragCompleted -= Thumb_DragCompleted;
    }

    private void Thumb_DragStarted(object sender, DragStartedEventArgs e)
    {
        mIsThumbDragging = true;
        mPreviousDiffX = 0;
        mPreviousDiffY = 0;
    }

    private void Thumb_DragDelta(object sender, DragDeltaEventArgs e)
    {
        if (mIsMoving)
        {
            return;
        }
        mIsMoving = true;
        try
        {
            if (mIsThumbDragging)
            {
                var doubleDetaX = e.HorizontalChange + mPreviousDiffX;
                var doubleDetaY = e.VerticalChange + mPreviousDiffY;

                var deltaX = (int)doubleDetaX;
                var deltaY = (int)doubleDetaY;

                mPreviousDiffX = (double)deltaX - doubleDetaX;
                mPreviousDiffY = (double)deltaY - doubleDetaY;

                HostPopup.Move(deltaX, deltaY);
            }
        }
        finally
        {
            mIsMoving = false;
        }
    }

    private void Thumb_DragCompleted(object sender, DragCompletedEventArgs e)
    {
        mIsThumbDragging = false;
    }

    #endregion

Класс HostPopup является подклассом Popup и использует следующие методы, использующие взаимодействие для перемещения окна:

    [DllImport("user32.dll", SetLastError = true)]
    internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

     [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

    internal void Move(int deltaX, int deltaY)
    {
        if (mIsMoving)
        {
            return;
        }
        mIsMoving = true;
        try
        {
            if (Child == null)
                return;

            var hwndSource = (PresentationSource.FromVisual(Child)) as HwndSource;

            if (hwndSource == null)
                return;
            var hwnd = hwndSource.Handle;

            RECT rect;

            if (!GetWindowRect(hwnd, out rect))
                return;

            MoveWindow(hwnd, rect.Left + deltaX, rect.Top + deltaY, (int)Width, (int)Height, true);
        }
        finally
        {
            mIsMoving = false;
        }
    }
2 голосов
/ 31 октября 2009

Если вы хотите, чтобы всплывающее окно больше походило на окно, я бы просто сделал окно вместо всплывающего окна.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...