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