c#(wpf)中WebBrowser拖动来移动窗口,改变窗口位置
程序员文章站
2022-07-02 16:57:15
wpf中的WebBrowser相比之前的winform阉割了不少东西,也增加了不少东西,但是msdn对wpf也没有较好的文档 WebBrowser可以说是一个.NET控件,相对于WPF中的控件,不在同一线程,它们不可重叠,相当于两个独立的窗口`(window ......
前言
wpf中的webbrowser相比之前的winform阉割了不少东西,也增加了不少东西,但是msdn对wpf也没有较好的文档
webbrowser可以说是一个.net控件,相对于wpf中的控件,不在同一线程,它们不可重叠,相当于两个独立的窗口(window)
正题
如上图所示,使用前端技术来实现的页面,因为要用到轮播,才用的webbrowser,wpf做这些很麻烦,但是无边框窗体,如果我们要拖动窗口,如果是wpf原生控件的话,很简单,给控件添加事件,然后
private void window_mousemove(object sender, mouseeventargs e) { if (e.leftbutton == mousebuttonstate.pressed) { try { this.dragmove(); } catch { } } }
但是如果想要通过拖动webbrowser来移动窗口这样是不行,我们需要通过js的拖拽事件响应到c#端进行窗口定位
js拖拽代码
var drag = function () { var drag = function (e) { e = e || window.event; window.external.drag(); } var dragend = function () { document.onmouseup = null; document.onmousemove = null; window.external.dragend(); } var dragstart = function (e) { e = e || window.event; document.onmouseup = dragend; document.onmousemove = drag; window.external.dragstart(); return false; } document.onmousedown = dragstart; }
c#端只需要接收到动作然后根据鼠标位置设置窗口的position即可
public void dragstart() { point p = new point(); getcursorpos(out p); this.offset.x = p.x - instance.left; this.offset.y = p.y - instance.top; } public void drag() { point p = new point(); getcursorpos(out p); instance.left = p.x - this.offset.x; instance.top = p.y - this.offset.y; } public void dragend() { this.offset.x = 0; this.offset.y = 0; }
这里的point是使用了结构体
[structlayout(layoutkind.sequential)] public struct point { public int x; public int y; public point(int x, int y) { this.x = x; this.y = y; } public override string tostring() { return ("x:" + x + ", y:" + y); } }
getcursorpos 是调用了user32.dll的getcursorpos来获取鼠标位置
[dllimport("user32.dll")] public static extern bool getcursorpos(out point pt);
具体这些算的,就比较简单了,跟js的拖拽元素的原理一样的
上一篇: 10行原生JS实现文字无缝滚动(超简单)
下一篇: MVC图片上传详解