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.