Кнопка «Скрыть/показать прокрутку вверх» на основе прокрутки WebView

Я делаю приложение UWP, содержащее WebView, и хочу реализовать простую кнопку «Прокрутить вверх», я уже сделал код для этой кнопки, и он работает:

        private async void ToTopButton_Click(object sender, RoutedEventArgs e)
        {
        var ScrollToTopString = @"var int = setInterval(function() { 
        window.scrollBy(0, -36);

        if( window.pageYOffset === 0 )
            clearInterval(int);
        }, 0.1);";
        await MyWebView.InvokeScriptAsync("eval", new string[] { ScrollToTopString });
        }

Но теперь я хочу показывать кнопку только в том случае, если она нужна пользователю, поэтому, если прокрутка WebView находится сверху, кнопка должна быть скрыта, и наоборот... Я исследовал и ничего не нашел. Кто-нибудь может мне помочь? Спасибо


person Community    schedule 01.05.2017    source источник


Ответы (1)


Я хочу показывать кнопку только в том случае, если она нужна пользователю, поэтому, если прокрутка WebView находится сверху, кнопка должна быть скрыта и наоборот.

Полоса прокрутки WebView недоступна для приложения напрямую, поскольку она является частью встроенного представления браузера Edge. Таким образом, вам может понадобиться использовать сценарий для отслеживания операции прокрутки с помощью события onscroll, а также вызывать сценарий InvokeScriptAsync.

И тогда вам может потребоваться уведомить ваше приложение uwp, если прокрутка находится вверху. Для этого вам может понадобиться использовать ScriptNotify событие Webview. Размещенная HTML-страница может запускать событие ScriptNotify в вашем приложении Магазина Windows, когда страница вызывает window.external.notify и передает строковый параметр.

Но обратите внимание на примечание ScriptNotify:

Чтобы предотвратить использование этого события вредоносными сценариями, включите его только для доверенных URI.

Вы должны включить URI страницы в раздел ApplicationContentUriRules манифеста приложения. (Это можно сделать в Visual Studio на вкладке Content URI конструктора Package.appxmanifest.) URI в этом списке должны использовать HTTPS и могут содержать подстановочные знаки поддоменов (например, "https://.microsoft.com"), но не могут содержать подстановочные знаки домена (например, "https://.com" и "https://.").

Вот готовый образец:

<Button x:Name="ToTopButton" Content="to top" Click="ToTopButton_Click"></Button>
<WebView x:Name="MyWebView"  Height="500" Width="400" Source="https://www.microsoft.com/en-sg/"  ScriptNotify="MyWebView_ScriptNotify" NavigationCompleted="MyWebView_NavigationCompleted"></WebView>

Код позади

private async void ToTopButton_Click(object sender, RoutedEventArgs e)
{
    var ScrollToTopString = @"var int = setInterval(function(){window.scrollBy(0, -36); if( window.pageYOffset === 0 ) clearInterval(int); }, 0.1);";
    await MyWebView.InvokeScriptAsync("eval", new string[] { ScrollToTopString });
}

private void MyWebView_ScriptNotify(object sender, NotifyEventArgs e)
{      
    var result = e.Value;
    if (result == "true")
    {
        ToTopButton.Visibility = Visibility.Collapsed;
    }
    else
    {
        ToTopButton.Visibility = Visibility.Visible;
    }
} 

private async void MyWebView_NavigationCompleted(WebView sender, WebViewNavigationCompletedEventArgs args)
{
    string addlistener = @"window.onscroll = function() {myFunction()};
                          function myFunction()
                          {if( window.pageYOffset === 0 )  window.external.notify('true'); else window.external.notify('false');} "; 
    await MyWebView.InvokeScriptAsync("eval", new string[] { addlistener });
    //first time check
    var firstnotify = "if( window.pageYOffset === 0 )  window.external.notify('true'); else window.external.notify('false')";
    await MyWebView.InvokeScriptAsync("eval", new string[] { firstnotify });
}

Частое уведомление может повлиять на производительность, поэтому это не очень рекомендуется, если вы не должны использовать эту функцию.

person Sunteen Wu    schedule 03.05.2017
comment
Спасибо! Это работает для меня, но я хочу знать, насколько сильно это влияет на общую производительность приложения. - person ; 03.05.2017
comment
@PabloJiménezPascual, я думаю, это зависит от того, как часто пользователь прокручивает. Если только несколько страниц, использующих это, не может повлиять на большее. - person Sunteen Wu; 04.05.2017