Я хочу показывать кнопку только в том случае, если она нужна пользователю, поэтому, если прокрутка 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