WebView2 応用テクニック
コンテキストメニューに項目を追加・削除する
WebView2コントロール上で右クリックで表示されるコンテキストメニューの項目を追加または削除する方法です。
実装方法
WebView2コントロールでコンテキストメニューを表示した場合はContextMenuRequestedイベントが発生します。
このContextMenuRequestedイベント発生時にメニュー項目の追加・削除の処理を行うことで、
表示されるコンテキストメニューから項目が追加・削除されます。
項目を追加する場合
ContextMenuRequestedイベント発生時に
CoreWebView2ContextMenuItemクラスのオブジェクトを作成し、
項目の表示名や動作を定義して、クリック時の処理を追加します。
Private Sub webView2_CoreWebView2InitializationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs) Handles webView2.CoreWebView2InitializationCompleted
'WebView2の初期化完了時に、コンテキストメニュー表示のイベントを定義
AddHandler webView2.CoreWebView2.ContextMenuRequested, AddressOf ContextMenuRequested
End Sub
Private Sub ContextMenuRequested(sender As Object, args As CoreWebView2ContextMenuRequestedEventArgs)
Dim menuList As IList(Of CoreWebView2ContextMenuItem) = args.MenuItems
'リストの項目を作成
Dim newItem As CoreWebView2ContextMenuItem =
webView2.CoreWebView2.Environment.CreateContextMenuItem("Display Page Uri", Nothing, CoreWebView2ContextMenuItemKind.Command)
'項目クリック時の処理を定義
AddHandler newItem.CustomItemSelected, Sub(send As Object, ex As Object)
Dim pageUri As String = args.ContextMenuTarget.PageUri
System.Threading.SynchronizationContext.Current.Post(Sub()
MessageBox.Show(pageUri, "Page Uri")
End Sub, Nothing)
End Sub
End Sub
private void wv2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
//WebView2の初期化完了時に、コンテキストメニュー表示のイベントを定義
wv2.CoreWebView2.ContextMenuRequested += ContextMenuRequested;
}
private void ContextMenuRequested(object sender, CoreWebView2ContextMenuRequestedEventArgs args)
{
IList<CoreWebView2ContextMenuItem> menuList = args.MenuItems;
//リストの項目を作成
CoreWebView2ContextMenuItem newItem =
wv2.CoreWebView2.Environment.CreateContextMenuItem("Display Page Uri", null, CoreWebView2ContextMenuItemKind.Command);
//項目クリック時の処理を定義
newItem.CustomItemSelected += delegate (object send, Object ex)
{
string pageUri = args.ContextMenuTarget.PageUri;
System.Threading.SynchronizationContext.Current.Post((_) =>
{
MessageBox.Show(pageUri, "Page Uri");
}, null);
};
//リストの最後の部分に追加
menuList.Insert(menuList.Count, newItem);
}
項目を削除する場合
ContextMenuRequestedイベント発生時に、
引数で渡されたメニュー情報の一覧からインデックス番号や名称で削除対象項目を探し、削除します。
Private Sub webView2_CoreWebView2InitializationCompleted(sender As Object, e As Microsoft.Web.WebView2.Core.CoreWebView2InitializationCompletedEventArgs) Handles webView2.CoreWebView2InitializationCompleted 'WebView2の初期化完了時に、コンテキストメニュー表示のイベントを定義 AddHandler webView2.CoreWebView2.ContextMenuRequested, AddressOf ContextMenuRequested End Sub Private Sub ContextMenuRequested(sender As Object, args As CoreWebView2ContextMenuRequestedEventArgs) Dim menuList As IList(Of CoreWebView2ContextMenuItem) = args.MenuItems Dim context As CoreWebView2ContextMenuTargetKind = args.ContextMenuTarget.Kind '画像を右クリックした場合 If context = CoreWebView2ContextMenuTargetKind.Image Then 'メニューから「名前をつけて画像を保存」を削除 For index As Integer = 0 To index < menuList.Count If menuList(index).Name = "saveImageAs" Then menuList.RemoveAt(index) Exit For End If Next 'ページ領域を右クリックした場合 ElseIf context = CoreWebView2ContextMenuTargetKind.Page Then 'メニューから「印刷」を削除 For index As Integer = 0 To index < menuList.Count If menuList(index).Name = "print" Then menuList.RemoveAt(index) Exit For End If Next End If End Sub
private void wv2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
//WebView2の初期化完了時に、コンテキストメニュー表示のイベントを定義
wv2.CoreWebView2.ContextMenuRequested += ContextMenuRequested;
}
private void ContextMenuRequested(object sender, CoreWebView2ContextMenuRequestedEventArgs args)
{
IList<CoreWebView2ContextMenuItem> menuList = args.MenuItems;
CoreWebView2ContextMenuTargetKind context = args.ContextMenuTarget.Kind;
//画像を右クリックした場合
if (context == CoreWebView2ContextMenuTargetKind.Image)
{
//メニューから「名前をつけて画像を保存」を削除
for (int index = 0; index < menuList.Count; index++)
{
if (menuList[index].Name == "saveImageAs")
{
menuList.RemoveAt(index);
break;
}
}
}
//ページ領域を右クリックした場合
else if (context == CoreWebView2ContextMenuTargetKind.Page)
{
//メニューから「印刷」を削除
for (int index = 0; index < menuList.Count; index++)
{
if (menuList[index].Name == "print")
{
menuList.RemoveAt(index);
break;
}
}
}
}
