前言

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的拖拽元素的原理一样的

C# WPF 中WebBrowser拖动来移动窗口,改变窗口位置的更多相关文章

  1. WPF中设置了WindowStyle="None"后,窗口仍然有边框的解决方法

    1. 设置了窗体的WindowStyle="None",窗口还是右边框,如下图: 2. 这是因为窗体默认是可以改变大小的,所以需要修改ResizeMode的值 ResizeMode ...

  2. [转载]WPF控件拖动

    这篇博文总结下WPF中的拖动,文章内容主要包括: 1.拖动窗口 2.拖动控件 Using Visual Studio 2.1thumb控件 2.2Drag.Drop(不连续,没有中间动画) 2.3拖动 ...

  3. WPF中展示HTML

    业务需求:将具有表格信息的HTML片段在WPF中展示出来,并像网页端一样,可以进行input的填写,checkbox选择,最后以HTML的形式完成保存. 天真的以为直接引入WPF中的WebBrowse ...

  4. WPF中禁止WebBrowser控件打开新窗口

    一.针对纯WPF的WebBrowser控件: <summary> Suppress Script Errors In WPF WebBrowser </summary> pub ...

  5. WPF中不规则窗体与WebBrowser控件的兼容问题解决办法

    原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法 引言 这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序. ...

  6. WPF中利用后台代码实现窗口分栏动态改变

    在WPF中实现窗口分栏并能够通过鼠标改变大小已经非常容易,例如将一个GRID分成竖排三栏显示,就可以将GRID先分成5列,其中两个固定列放GridSplitter. <Grid Backgrou ...

  7. 【WPF】监听WPF的WebBrowser控件弹出新窗口的事件

    原文:[WPF]监听WPF的WebBrowser控件弹出新窗口的事件 WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗 ...

  8. 在WPF的WebBrowser控件中屏蔽脚本错误的提示

    在WPF中使用WebBrowser控件显示网页时,经常会报脚本错误的提示,如何屏蔽掉这些错误提示呢.方法是定义如下方法: public void SuppressScriptErrors(WebBro ...

  9. WPF中窗口控件的跨线程调用

    在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可. 在WPF中要麻烦一下,同样的不允许跨线程访问,因为没 ...

随机推荐

  1. vue ui之 iview 事件拦截

    用过easyui的,应该清楚easyui组件有很多before事件拦截,有时候会特别重要. 最近在研究vue的ui组件iview虽然功能也不错,感觉还是没有像easyui那样强大,就比如before事 ...

  2. Flex 排序 SortField and Sort

    部分代码 var arrayOfCat:ArrayCollection=outerDocument.getCagegory();   // 需要排序的数组 //创建SortField对象 var so ...

  3. 【Java】生成图形验证码

    本章介绍一个能生成比较好看的图形验证码类 生成验证码工具类 package com.util; import java.awt.Color; import java.awt.Font; import ...

  4. python之Bottle框架

    一.简单的Bottle框架 1)bottle框架简介 安装 pip install bottle Bottle是一个快速.简洁.轻量级的基于WSIG的微型Web框架. 此框架只由一个 .py 文件,除 ...

  5. AOP的异常通知

      一.配置异常通知的步骤 (Aspectj方式) 1.只有当切点报异常才能触发异常通知 2.在spring中有Aspectj 方式提供了异常通知方法 2.1 如果希望通过 schema-base 实 ...

  6. 将爬取的网页数据保存到数据库时报错不能提交JPA,Caused by: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB6 \xE2...' for column 'content' at row 1

    错误原因:我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范).正常的汉字一般不会超过3个字节,为什么为出现4个字节呢?实 ...

  7. 2018.11.02 洛谷P2312 解方程(数论)

    传送门 直接做肯定会TLETLETLE. 于是考验乱搞能力的时候到了. 我们随便选几个质数来checkcheckcheck合法解,如果一个数无论怎么checkcheckcheck都是合法的那么就有很大 ...

  8. Java基础之多线程没那么复杂!

    多线程的引入 1.什么是多线程 线程是程序执行的一条路径,一个进程中可以包含多条线程;多线程并发执行可以提高程序的效率</br> 2.进程和线程之间的关系 操作系统可以同时执行多个任务,每 ...

  9. 消除flex-wrap之后每个item上下的距离

    设置flex-wrap后,每个item上下都会有距离.更改父元素的高度,就可以删除这些距离. 更改后:

  10. hibernate添加数据报错:Could not execute JDBC batch update

    报错如下图所示: 报错原因:在配置文件或注解里设置了字段关联,但数据却没有关联. 解决方法:我的错误是向一个多对多的关联表里插入数据,由于表中一个字段的数据是从另一张表里get到的,通过调试发现,从以 ...