WinFormOverlayWPF.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using Microsoft.Reporting.WinForms;
  2. using System.ComponentModel;
  3. using System.Windows;
  4. using System.Windows.Forms;
  5. using System.Windows.Interop;
  6. using Application = System.Windows.Application;
  7. namespace Muchinfo.WPF.Controls.WebBrowser
  8. {
  9. /// <summary>
  10. /// Displays a WinForms.WebBrowser control over a given placement target element in a WPF Window.
  11. /// Applies the opacity of the Window to the WebBrowser control.
  12. /// 引用System.Window..Presentation
  13. /// </summary>
  14. public class WinFormOverlayWPF
  15. {
  16. Window _owner;
  17. FrameworkElement _placementTarget;
  18. Form _form; // the top-level window holding the WebBrowser control
  19. System.Windows.Forms.WebBrowser _wb;
  20. ReportViewer _rv;
  21. Muchinfo.Text.Editor _txtEditor;
  22. public System.Windows.Forms.WebBrowser WebBrowser { get { return _wb; } }
  23. public ReportViewer ReportViewer { get { return _rv; } }
  24. public Muchinfo.Text.Editor TxtEditor { get { return _txtEditor; } }
  25. private OverlayType CurrentOverlayType { get; set; }
  26. public WinFormOverlayWPF(FrameworkElement placementTarget, OverlayType overlayType)
  27. {
  28. this.CurrentOverlayType = overlayType;
  29. _placementTarget = placementTarget;
  30. Window owner = Window.GetWindow(placementTarget) ?? Application.Current.MainWindow;
  31. _owner = owner;
  32. _form = new Form();
  33. _form.Opacity = owner.Opacity;
  34. _form.ShowInTaskbar = false;
  35. _form.FormBorderStyle = FormBorderStyle.None;
  36. switch (overlayType)
  37. {
  38. case OverlayType.WebBrowser:
  39. _wb = new System.Windows.Forms.WebBrowser();
  40. _wb.Dock = DockStyle.Fill;
  41. _form.Controls.Add(_wb);
  42. break;
  43. case OverlayType.ReportViewer:
  44. _rv = new ReportViewer();
  45. _rv.Dock = DockStyle.Fill;
  46. _form.Controls.Add(_rv);
  47. break;
  48. case OverlayType.TxtEditor:
  49. _txtEditor = new Text.Editor();
  50. _txtEditor.Dock = DockStyle.Fill;
  51. _form.Controls.Add(_txtEditor);
  52. break;
  53. default:
  54. _wb = new System.Windows.Forms.WebBrowser();
  55. _wb.Dock = DockStyle.Fill;
  56. _form.Controls.Add(_wb);
  57. break;
  58. }
  59. _form.Hide();
  60. //owner.SizeChanged += delegate { OnSizeLocationChanged(); };
  61. owner.LocationChanged += delegate { Reposition(); };
  62. _placementTarget.SizeChanged += delegate { Reposition(); };
  63. //if (owner.IsVisible)
  64. // InitialShow();
  65. //else
  66. // owner.SourceInitialized += delegate
  67. // {
  68. // InitialShow();
  69. // };
  70. DependencyPropertyDescriptor dpd = DependencyPropertyDescriptor.FromProperty(UIElement.OpacityProperty, typeof(Window));
  71. dpd.AddValueChanged(owner, delegate { _form.Opacity = _owner.Opacity; });
  72. _form.FormClosing += delegate { _owner.Close(); };
  73. }
  74. public void InitialShow()
  75. {
  76. var owner = new NativeWindow();
  77. owner.AssignHandle(((HwndSource)HwndSource.FromVisual(_owner)).Handle);
  78. _form.Show(owner);
  79. owner.ReleaseHandle();
  80. }
  81. //DispatcherOperation _repositionCallback;
  82. //void OnSizeLocationChanged()
  83. //{
  84. // // To reduce flicker when transparency is applied without DWM composition,
  85. // // do resizing at lower priority.
  86. // if (_repositionCallback == null)
  87. // _repositionCallback = _owner.Dispatcher.BeginInvoke(Reposition, DispatcherPriority.Input);
  88. //}
  89. public void Reposition()
  90. {
  91. //_repositionCallback = null;
  92. var offset = _placementTarget.TranslatePoint(new Point(), _owner);
  93. var size = new Point(_placementTarget.ActualWidth, _placementTarget.ActualHeight);
  94. var hwndSource = (HwndSource)HwndSource.FromVisual(_owner);
  95. var ct = hwndSource.CompositionTarget;
  96. offset = ct.TransformToDevice.Transform(offset);
  97. size = ct.TransformToDevice.Transform(size);
  98. var screenLocation = new Win32.POINT(offset);
  99. Win32.ClientToScreen(hwndSource.Handle, ref screenLocation);
  100. var screenSize = new Win32.POINT(size);
  101. Win32.MoveWindow(_form.Handle, screenLocation.X, screenLocation.Y, screenSize.X, screenSize.Y, true);
  102. _form.SetBounds(screenLocation.X, screenLocation.Y, screenSize.X, screenSize.Y);
  103. _form.Update();
  104. }
  105. /// <summary>
  106. /// 关闭webBrowser
  107. /// </summary>
  108. public void CloseWindow()
  109. {
  110. if (this.CurrentOverlayType == OverlayType.WebBrowser)
  111. _form.Controls.Remove(_wb);
  112. if (this.CurrentOverlayType == OverlayType.ReportViewer)
  113. _form.Controls.Remove(_rv);
  114. if (this.CurrentOverlayType == OverlayType.TxtEditor)
  115. _form.Controls.Remove(_txtEditor);
  116. _form.Hide();
  117. }
  118. /// <summary>
  119. /// 隐藏webBrowser
  120. /// </summary>
  121. public void HiddenWindow()
  122. {
  123. _form.Hide();
  124. }
  125. /// <summary>
  126. /// Disposes 实例
  127. /// </summary>
  128. public void Dispose()
  129. {
  130. CloseWindow();
  131. if (_wb != null) _wb.Dispose();
  132. if (_rv != null) _rv.Dispose();
  133. if (_txtEditor != null) _txtEditor.Dispose();
  134. if (_form != null) _form.Dispose();
  135. }
  136. /// <summary>
  137. /// 显示webBrowser
  138. /// </summary>
  139. public void ShowWindow()
  140. {
  141. _form.Show();
  142. }
  143. };
  144. public enum OverlayType
  145. {
  146. WebBrowser = 1,
  147. ReportViewer = 2,
  148. TxtEditor = 3
  149. }
  150. }