| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- 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
- {
- /// <summary>
- /// 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
- /// </summary>
- 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();
- }
- /// <summary>
- /// 关闭webBrowser
- /// </summary>
- 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();
- }
- /// <summary>
- /// 隐藏webBrowser
- /// </summary>
- public void HiddenWindow()
- {
- _form.Hide();
- }
- /// <summary>
- /// Disposes 实例
- /// </summary>
- public void Dispose()
- {
- CloseWindow();
- if (_wb != null) _wb.Dispose();
- if (_rv != null) _rv.Dispose();
- if (_txtEditor != null) _txtEditor.Dispose();
- if (_form != null) _form.Dispose();
- }
- /// <summary>
- /// 显示webBrowser
- /// </summary>
- public void ShowWindow()
- {
- _form.Show();
- }
- };
- public enum OverlayType
- {
- WebBrowser = 1,
- ReportViewer = 2,
- TxtEditor = 3
- }
- }
|