Movimentando a Janela WPF ao Arrastar o Controle WebBrowser com C#

No WPF, o controle WebBrowser permite incorporar conteúdo web, mas devido à separação de threads, ele opera como uma janela endependente. Arrastar diretamente o WebBrowser para movimentar a janela principal requer integração entre eventos JavaScript e código C#.

Para isso, utilize eventos de arrastar no JavaScript para notificar o aplciativo WPF, que então atualiza a posição da janela com base na posição do cursor.

Implementação JavaScript

O código JavaScript abaixo define funções para iniciar, arrastar e finalizar o arrasto, comunicando-se com o C# via window.external:


function configurarArrasto() {
    const iniciarArrasto = (evento) => {
        evento = evento || window.event;
        document.onmouseup = finalizarArrasto;
        document.onmousemove = executarArrasto;
        window.external.IniciarArrasto();
        return false;
    };

    const executarArrasto = (evento) => {
        evento = evento || window.event;
        window.external.ExecutarArrasto();
    };

    const finalizarArrasto = () => {
        document.onmouseup = null;
        document.onmousemove = null;
        window.external.FinalizarArrasto();
    };

    document.onmousedown = iniciarArrasto;
}

configurarArrasto();

Implementação C#

No lado do C#, crie métodos para manipular os eventos recebidos. A estrutura Ponto armazena coordenadas, e a função ObterPosicaoCursor obtém a posição atual do mouse.


using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct Ponto
{
    public int X;
    public int Y;

    public Ponto(int x, int y)
    {
        X = x;
        Y = y;
    }
}

[DllImport("user32.dll")]
public static extern bool ObterPosicaoCursor(out Ponto pt);

public partial class MainWindow : Window
{
    private Ponto deslocamento;

    public void IniciarArrasto()
    {
        Ponto cursor;
        ObterPosicaoCursor(out cursor);
        deslocamento.X = cursor.X - (int)this.Left;
        deslocamento.Y = cursor.Y - (int)this.Top;
    }

    public void ExecutarArrasto()
    {
        Ponto cursor;
        ObterPosicaoCursor(out cursor);
        this.Left = cursor.X - deslocamento.X;
        this.Top = cursor.Y - deslocamento.Y;
    }

    public void FinalizarArrasto()
    {
        deslocamento.X = 0;
        deslocamento.Y = 0;
    }
}

Ao chamar IniciarArrasto, calcula-se o deslocamento entre o cursor e a janela. ExecutarArrasto move a janela mantendo o deslocamento. FinalizarArrasto reseta os valores para preparar o próximo arrasto.

Tags: C# WPF WebBrowser javascript Interop

Publicado em 7-21 13:58