using Microsoft.Reporting.WinForms;
using System.ComponentModel;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Interop;
using Application = System.Windows.Application;
namespace Muchinfo.WPF.Controls.WebBrowser
{
///
/// Displays a WinForms.WebBrowser control over a given placement target element in a WPF Window.
/// Applies the opacity of the Window to the WebBrowser control.
/// 引用System.Window..Presentation
///
public class WinFormOverlayWPF
{
Window _owner;
FrameworkElement _placementTarget;
Form _form; // the top-level window holding the WebBrowser control
System.Windows.Forms.WebBrowser _wb;
ReportViewer _rv;
Muchinfo.Text.Editor _txtEditor;
public System.Windows.Forms.WebBrowser WebBrowser { get { return _wb; } }
public ReportViewer ReportViewer { get { return _rv; } }
public Muchinfo.Text.Editor TxtEditor { get { return _txtEditor; } }
private OverlayType CurrentOverlayType { get; set; }
public WinFormOverlayWPF(FrameworkElement placementTarget, OverlayType overlayType)
{
this.CurrentOverlayType = overlayType;
_placementTarget = placementTarget;
Window owner = Window.GetWindow(placementTarget) ?? Application.Current.MainWindow;
_owner = owner;
_form = new Form();
_form.Opacity = owner.Opacity;
_form.ShowInTaskbar = false;
_form.FormBorderStyle = FormBorderStyle.None;
switch (overlayType)
{
case OverlayType.WebBrowser:
_wb = new System.Windows.Forms.WebBrowser();
_wb.Dock = DockStyle.Fill;
_form.Controls.Add(_wb);
break;
case OverlayType.ReportViewer:
_rv = new ReportViewer();
_rv.Dock = DockStyle.Fill;
_form.Controls.Add(_rv);
break;
case OverlayType.TxtEditor:
_txtEditor = new Text.Editor();
_txtEditor.Dock = DockStyle.Fill;
_form.Controls.Add(_txtEditor);
break;
default:
_wb = new System.Windows.Forms.WebBrowser();
_wb.Dock = DockStyle.Fill;
_form.Controls.Add(_wb);
break;
}
_form.Hide();
//owner.SizeChanged += delegate { OnSizeLocationChanged(); };
owner.LocationChanged += delegate { Reposition(); };
_placementTarget.SizeChanged += delegate { Reposition(); };
//if (owner.IsVisible)
// InitialShow();
//else
// owner.SourceInitialized += delegate
// {
// InitialShow();
// };
DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(UIElement.OpacityProperty, typeof(Window));
dpd.AddValueChanged(owner, delegate { _form.Opacity = _owner.Opacity; });
_form.FormClosing += delegate { _owner.Close(); };
}
public void InitialShow()
{
var owner = new NativeWindow();
owner.AssignHandle(((HwndSource)HwndSource.FromVisual(_owner)).Handle);
_form.Show(owner);
owner.ReleaseHandle();
}
//DispatcherOperation _repositionCallback;
//void OnSizeLocationChanged()
//{
// // To reduce flicker when transparency is applied without DWM composition,
// // do resizing at lower priority.
// if (_repositionCallback == null)
// _repositionCallback = _owner.Dispatcher.BeginInvoke(Reposition, DispatcherPriority.Input);
//}
public void Reposition()
{
//_repositionCallback = null;
var offset = _placementTarget.TranslatePoint(new Point(), _owner);
var size = new Point(_placementTarget.ActualWidth, _placementTarget.ActualHeight);
var hwndSource = (HwndSource)HwndSource.FromVisual(_owner);
var ct = hwndSource.CompositionTarget;
offset = ct.TransformToDevice.Transform(offset);
size = ct.TransformToDevice.Transform(size);
var screenLocation = new Win32.POINT(offset);
Win32.ClientToScreen(hwndSource.Handle, ref screenLocation);
var screenSize = new Win32.POINT(size);
Win32.MoveWindow(_form.Handle, screenLocation.X, screenLocation.Y, screenSize.X, screenSize.Y, true);
_form.SetBounds(screenLocation.X, screenLocation.Y, screenSize.X, screenSize.Y);
_form.Update();
}
///
/// 关闭webBrowser
///
public void CloseWindow()
{
if (this.CurrentOverlayType == OverlayType.WebBrowser)
_form.Controls.Remove(_wb);
if (this.CurrentOverlayType == OverlayType.ReportViewer)
_form.Controls.Remove(_rv);
if (this.CurrentOverlayType == OverlayType.TxtEditor)
_form.Controls.Remove(_txtEditor);
_form.Hide();
}
///
/// 隐藏webBrowser
///
public void HiddenWindow()
{
_form.Hide();
}
///
/// Disposes 实例
///
public void Dispose()
{
CloseWindow();
if (_wb != null) _wb.Dispose();
if (_rv != null) _rv.Dispose();
if (_txtEditor != null) _txtEditor.Dispose();
if (_form != null) _form.Dispose();
}
///
/// 显示webBrowser
///
public void ShowWindow()
{
_form.Show();
}
};
public enum OverlayType
{
WebBrowser = 1,
ReportViewer = 2,
TxtEditor = 3
}
}