github にあったサンプルを使用して WebBrowser 上にウインドウを重ねて線やコントロールを重ねて表示させています。
サンプル:[https://github.com/michaelsutton/hwnd-adorner]
WebBrowserでは画像を主に表示させていて BrowserPresenter() で 初回作成時に
C#
1 public BrowserPresenter() 2 { 3 var browser = new WebBrowser(); 4 browser.Source = new Uri(adress); 5 6 HwndHost = browser;
で、html を表示しています。
このサンプルだと、後で adress を変えて次を表示させようとしても一度ウインドウを終了し再度表示させないと次の画像(サイト)に切り替わりません。Presenterのコンストラクタでブラウザに表示させていてHwndHost = browser;でサンプルの本体にコピーしているようです。
ここがちょっと不便なので、ウインドウを表示させたまま画像(サイト)を切り替えたいのですが、そのように改変できますでしょうか?
多分ですが、下記のxaml で初期化している部分を任意のタイミングで 上記のBrowserPresenter.csのBrowserPresenter() をビハインドコード(DisplayForm.xaml.cs)から呼び出すように変更できないでしょうか?
C#
1DisplayForm.xaml 2 <adorner:HwndAdornerManager> 3 <Grid> 4 <ReportLite3.Adorner:BrowserPresenter> 5 <ReportLite3.Adorner:BrowserPresenter.Adornment> 6 <ReportLite3.Adorner:BrowserAdornment /> 7 </ReportLite3.Adorner:BrowserPresenter.Adornment> 8 </ReportLite3.Adorner:BrowserPresenter> 9 </Grid> 10 </adorner:HwndAdornerManager>
サンプルと実コードの抜粋
C#,
1DisplayForm.xaml 2 <Grid> 3 <Grid.ColumnDefinitions> 4 <ColumnDefinition Width="705"/> 5 </Grid.ColumnDefinitions> 6 <Grid.RowDefinitions> 7 <RowDefinition Height="35"/> 8 <RowDefinition Height="780" /> 9 </Grid.RowDefinitions> 10 11 <StackPanel Orientation="Vertical" Grid.Row="1" Grid.Column="0" Background="White"> 12 <ScrollViewer Height="770"> 13 <adorner:HwndAdornerManager> 14 <Grid> 15 <ReportLite3.Adorner:BrowserPresenter> 16 <ReportLite3.Adorner:BrowserPresenter.Adornment> 17 <ReportLite3.Adorner:BrowserAdornment /> 18 </ReportLite3.Adorner:BrowserPresenter.Adornment> 19 </ReportLite3.Adorner:BrowserPresenter> 20 </Grid> 21 </adorner:HwndAdornerManager> 22 </ScrollViewer> 23 </StackPanel> 24 </Grid> 25 26 27BrowserAdornment.xaml 28<UserControl x:Class="ReportLite3.Adorner.BrowserAdornment" 29 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 30 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 31 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 32 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 33 mc:Ignorable="d" 34 d:DesignHeight="800" d:DesignWidth="710" 35 HorizontalAlignment="Center" VerticalAlignment="Center" Loaded="UserControl_Loaded"> 36 37 <ScrollViewer Height="770" Width="700"> 38 <Canvas Name="canvas1" Height="770" Width="700"> 39 40 </Canvas> 41 </ScrollViewer> 42</UserControl> 43 44 45BrowserPresenter.cs 46 public class BrowserPresenter : HwndHostPresenter 47 { 48 public static string adress = @"\LANDISK-610775\ReportConfig\RequestForm\InitImage.html"; 49 public static BrowserPresenter _presenterInstance; 50 51 public BrowserPresenter() 52 { 53 var browser = new WebBrowser(); 54 browser.Source = new Uri(adress); 55 56 HwndHost = browser; 57 RegisterToAppShutdown(); 58 } 59 60 private void RegisterToAppShutdown() 61 { 62 Application.Current.Dispatcher.ShutdownStarted += OnShutdownStarted; 63 } 64 65 private void OnShutdownStarted(object sender, EventArgs e) 66 { 67 Dispose(); 68 } 69 70 protected override void Dispose(bool disposing) 71 { 72 if (disposing) 73 { 74 var host = HwndHost; 75 if(host != null) 76 host.Dispose(); 77 } 78 } 79 } 80 81 82HwndHostPresenter.cs 83 public class HwndHostPresenter : FrameworkElement, IDisposable 84 { 85 #region Fields 86 87 private UIElement m_child; 88 private HwndHost m_hwndHost; 89 private bool m_mouseIsOverHwnd; 90 91 private readonly HwndAdorner m_hwndAdorner; 92 private UIElement m_adornment; 93 94 static HwndHostPresenter() 95 { 96 EventManager.RegisterClassHandler(typeof(HwndHostPresenter), MouseEnterEvent, new RoutedEventHandler(OnMouseEnterOrLeave)); 97 EventManager.RegisterClassHandler(typeof(HwndHostPresenter), MouseLeaveEvent, new RoutedEventHandler(OnMouseEnterOrLeave)); 98 99 EventManager.RegisterClassHandler(typeof(HwndHostPresenter), HwndExtensions.HwndMouseEnterEvent, new RoutedEventHandler(OnHwndMouseEnterOrLeave)); 100 EventManager.RegisterClassHandler(typeof(HwndHostPresenter), HwndExtensions.HwndMouseLeaveEvent, new RoutedEventHandler(OnHwndMouseEnterOrLeave)); 101 } 102 103 public HwndHostPresenter() 104 { 105 m_hwndAdorner = new HwndAdorner(this); 106 AddLogicalChild(m_hwndAdorner.Root); 107 } 108 109 : 110 111 public HwndHost HwndHost 112 { 113 get { return m_hwndHost; } 114 set 115 { 116 if (m_hwndHost == value) return; 117 118 RemoveLogicalChild(m_hwndHost); 119 120 m_hwndHost = value; 121 122 AddLogicalChild(value); 123 if (Hosting) 124 { 125 Child = value; 126 } 127 } 128 }
![guest](/img/icon/icnUserSample.jpg)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/01 02:10
2020/10/01 02:25
2020/10/01 03:09