Способ сделать окно без окон WPF перетаскиваемым без получения InvalidOperationException - PullRequest
8 голосов
/ 18 июля 2010

У меня есть окно без основного окна WPF.Я пытаюсь сделать так, чтобы конечный пользователь мог перетаскивать окно.

Я добавил следующее в конструктор окна:

this.MouseLeftButtonDown += delegate { DragMove(); };

Проблема в том, что у меня естьдиалоговое окно, которое открывается с двумя кнопками.Когда я нажимаю одну из этих кнопок, я получаю необработанное исключение InvalidOperationException с сообщением «Может вызывать DragMove только тогда, когда нажата основная кнопка мыши».

В связи с этим возникает несколько вопросов.что-нибудь делать с этим?Как я могу сделать это без этого исключения?

Спасибо!

Ответы [ 4 ]

7 голосов
/ 18 июля 2010

«Правильный» способ сделать окно без полей подвижным - это вернуть HTCAPTION в сообщении WM_NCHITTEST. Следующий код показывает, как это сделать. Обратите внимание, что вы захотите вернуть HTCLIENT, если курсор находится над определенными визуальными элементами вашего окна, поэтому этот код только для начала.

http://msdn.microsoft.com/en-us/library/ms645618(VS.85).aspx

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    protected override void OnSourceInitialized(EventArgs e)
    {
        HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(this);
        hwndSource.AddHook(WndProcHook); 
        base.OnSourceInitialized(e);
    }

    private static IntPtr WndProcHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handeled)
    {
        if (msg == 0x0084) // WM_NCHITTEST
        {
            handeled = true;
            return (IntPtr)2; // HTCAPTION
        }
        return IntPtr.Zero;
    }
}
1 голос
/ 13 марта 2012

Установите атрибут MouseDown окна или любого другого элемента управления, который вы хотите использовать:

<TextBlock Grid.Column="0" HorizontalAlignment="Stretch"  MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" >Handy Dandy</TextBlock>

И внедрить его в код, подобный следующему:

private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
     this.DragMove();
}

От: http://www2.suddenelfilio.net/2007/01/19/wpf-draggable-windowless-windows/

0 голосов
/ 27 июля 2012

Вы можете переопределить оригинальный метод:

 public new void DragMove()
     {
        if (this.WindowState == WindowState.Normal)
        {
            SendMessage(hs.Handle, WM_SYSCOMMAND, (IntPtr)0xf012, IntPtr.Zero);
            SendMessage(hs.Handle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
        }
    }
0 голосов
/ 29 августа 2010

Существует проект Microsoft, который обрабатывает весь стиль "без окон" и многое другое, и это с открытым исходным кодом, вы можете взглянуть на http://code.msdn.microsoft.com/WPFShell. Я использую в коммерческом финансовом приложении, и hasn не сталкивайтесь с какими-либо проблемами в любой версии Windows.

...