私はボタンがWebViewスクロールが上にある場合、ボタンが隠されて、viceversaする必要があるので、それを表示するだけです。
WebViewのスクロールバーは、埋め込みエッジブラウザビューの一部であるため、アプリケーションから直接アクセスできません。スクリプトを使用してonscroll eventでスクロール操作を監視し、InvokeScriptAsync
でスクリプトを呼び出す必要があります。
そして、スクロールが上部にある場合は、あなたのuwpアプリケーションに通知する必要があるかもしれません。そのためにはScriptNotify
というイベントをWebview
というイベントで使用する必要があります。ページがwindow.external.notify
を呼び出し、文字列パラメータを渡すと、ホストされたHTMLページがWindowsストアアプリケーションのScriptNotify
イベントを発生させる可能性があります。
しかしScriptNotify
のノートについての注意を払う:
は、このイベントを悪用から悪意のあるスクリプトを防止するためには、信頼できるURIのためにそれを有効にしてください。
ページのURIを、アプリケーションマニフェストのApplicationContentUriRulesセクションに含める必要があります。 (これはVisual StudioでPackage.appxmanifestデザイナーの[コンテンツURI]タブで行うことができます)。このリストの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 });
}
背後よく知らせるこの機能を使用する必要がありますない限り、これは非常にお勧めしませんパフォーマンスに影響を与える可能性があります。
ありがとうございます!これは私の仕事ですが、これがアプリケーションの全体的なパフォーマンスにどれだけ影響を及ぼしているかを知りたいでしょう。 –
@PabloJiménezPascual、私はそれがユーザーのスクロール頻度に依存すると思います。これを使用しているページがほんのわずかにすぎない場合、 –