Как создать меню правой кнопки мыши в Webview для любого сайта? - PullRequest
0 голосов
/ 31 мая 2019

Я знаю, как реализовать InvokeScriptAsync для получения URL-адреса любой гиперссылки на указанном веб-сайте в элементе управления Webview в uwp, и я сделал это без каких-либо проблем, указав веб-сайты в разделе Content URI в манифесте.

Но я сталкиваюсь с несколькими браузерами в магазине, в которых я вижу меню правой кнопки мыши на веб-страницах на всех веб-сайтах, независимо от того, какой URL. Например, «UCBrowser UWP», который находится в магазине Microsoft, этот браузер имеет возможность получить щелчок правой кнопкой мыши на любом веб-сайте. Как это можно сделать?

Подводя итог, я хочу создать меню правой кнопки мыши, по крайней мере, с меню "Открыть ссылку в другой вкладке" с любого веб-сайта.

1 Ответ

0 голосов
/ 03 июня 2019

Как создать меню правой кнопки мыши в Webview для любого сайта?

В html есть событие oncontextmenu, которое используется для обнаружения щелчка правой кнопкой мыши. И вы можете использовать WebView InvokeScriptAsync, чтобы внедрить обнаруженный метод в функцию eval, где находится на html-странице. И когда щелкнет правой кнопкой мыши, вы можете использовать window.external.notify перезвонить.

Например

Создать контекстное меню для тега <a>.

public MainPage()
{
    this.InitializeComponent();

    MyWebView.LoadCompleted += MyWebView_LoadCompleted;
}

private async void MyWebView_LoadCompleted(object sender, NavigationEventArgs e)
{
    string functionString = @"var anchors = document.querySelectorAll('a');      
  for (var i = 0; i < anchors.length; i += 1) {
        anchors[i].oncontextmenu = function (e) {
            var e = e||window.event;  
            var oX = e.clientX;
            var oY = e.clientY;
            var href = this.getAttribute('href');
            window.external.notify([oX.toString(), oY.toString(), href].toString());
        };
    }";
    await MyWebView.InvokeScriptAsync("eval", new string[] { functionString });
}

private void MyWebView_ScriptNotify(object sender, NotifyEventArgs e)
{
    var items = e.Value.Split(',');
    MenuFlyout myFlyout = new MenuFlyout();
    MenuFlyoutItem firstItem = new MenuFlyoutItem { Text = "Open new tab" };
    myFlyout.Items.Add(firstItem);
    myFlyout.ShowAt(sender as UIElement, new Point(System.Convert.ToDouble(items[0]) , System.Convert.ToDouble(items[1])));
}

Обратите внимание

Разрешено сайты указаны в разделе Content URI Package.appxmanifest и не могут содержать доменные символы подстановки и должны быть https.

enter image description here

И это пример кода , на который вы могли бы ссылаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...