欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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)

正题

c#(wpf)中WebBrowser拖动来移动窗口,改变窗口位置

如上图所示,使用前端技术来实现的页面,因为要用到轮播,才用的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的拖拽元素的原理一样的