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 } }