0

読むべきコンテンツがいくつかあり、webbrowserコントロールにロードされています。読みながら進捗状況を確認したい。どういうわけかウェブブラウザコントロールで垂直スクロールバーを表示することは可能ですか?Webブラウザ全体をScrollViewerScrollViewer.VerticalScrollVisibilityに入れてみましたが、何も機能しません。

4

2 に答える 2

1

MisterGoodcat のアイデアに基づく私のソリューションを確認してください。ページが読み込まれた後に JavaScript を挿入するカスタム Web ブラウザー コントロールを作成しました。

XAML:

<UserControl x:Class="Wallet.Views.Controls.WebBrowserWithScrollbar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
mc:Ignorable="d"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
d:DesignHeight="480" d:DesignWidth="480">

<Grid>
    <phone:WebBrowser 
            Name="WebBrowserControl"
            IsScriptEnabled="True"
            Margin="0 0 5 0"
            ScriptNotify="WebBrowser_OnScriptNotify">

    </phone:WebBrowser>

    <ScrollBar x:Name="DisplayScrollBar"
                Orientation="Vertical"
                HorizontalAlignment="Right"
                VerticalAlignment="Stretch"
                Minimum="0"
                Maximum="100"
                Value="0" 
                Visibility="Collapsed"/>
</Grid>

コードビハインド:

/// <summary>
/// Adds a vertical scrollbar to the normal WebBrowser control
/// </summary>
public partial class WebBrowserWithScrollbar : UserControl
{
    #region Dependency Properties
    public static readonly DependencyProperty SourceProperty = DependencyProperty.Register(
        "Source", typeof(string), typeof(WebBrowserWithScrollbar), new PropertyMetadata(string.Empty, OnSourcePropertyChanged));

    #endregion

    #region Fields
    private int _visibleHeight;
    private int _scrollHeight;
    #endregion

    #region Constructors
    public WebBrowserWithScrollbar()
    {
        InitializeComponent();
        this.LoadCompleted += this.WebBrowserControlLoadCompleted;
    }
    #endregion

    #region Event Handlers

    public event LoadCompletedEventHandler LoadCompleted
    {
        add
        {
            WebBrowserControl.LoadCompleted += value;
        }

        remove
        {
            WebBrowserControl.LoadCompleted -= value;
        }
    }

    public event EventHandler<NotifyEventArgs> ScriptNotify
    {
        add
        {
            WebBrowserControl.ScriptNotify += value;
        }

        remove
        {
            WebBrowserControl.ScriptNotify -= value;
        }
    }

    public event EventHandler<NavigationEventArgs> Navigated
    {
        add
        {
            WebBrowserControl.Navigated += value;
        }

        remove
        {
            WebBrowserControl.Navigated -= value;
        }
    }

    public event EventHandler<NavigatingEventArgs> Navigating
    {
        add
        {
            WebBrowserControl.Navigating += value;
        }

        remove
        {
            WebBrowserControl.Navigating -= value;
        }
    }

    public event NavigationFailedEventHandler NavigationFailed
    {
        add
        {
            WebBrowserControl.NavigationFailed += value;
        }

        remove
        {
            WebBrowserControl.NavigationFailed -= value;
        }
    }

    #endregion

    #region Properties
    public string Source
    {
        get
        {
            return (string)this.GetValue(SourceProperty);
        }

        set
        {
            this.SetValue(SourceProperty, value);
        }
    }
    #endregion

    #region Static Methods

    private static void OnSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var controlWrapper = d as WebBrowserWithScrollbar;
        if (controlWrapper != null)
        {
            var webBrowser = controlWrapper.WebBrowserControl;
            var newSource = e.NewValue as string;
            Uri uri;

            if (webBrowser != null &&
                newSource != null &&
                e.NewValue != e.OldValue &&
                !string.IsNullOrEmpty(newSource) &&
                Uri.TryCreate(newSource, UriKind.Absolute, out uri))
            {
                webBrowser.Source = uri;
            }
        }
    }

    #endregion

    #region Methods
    private void WebBrowserControlLoadCompleted(object sender, NavigationEventArgs e)
    {
        this.InitializeScrollBarScript();
    }

    private void WebBrowser_OnScriptNotify(object sender, NotifyEventArgs e)
    {
        var parts = e.Value.Split('=');
        if (parts.Length != 2)
        {
            return;
        }

        int number;
        if (!int.TryParse(parts[1], out number))
        {
            return;
        }

        if (parts[0] == "scrollHeight")
        {
            _scrollHeight = number;
            if (_visibleHeight > 0)
            {
                DisplayScrollBar.Maximum = _scrollHeight - _visibleHeight;
            }
        }
        else if (parts[0] == "clientHeight")
        {
            _visibleHeight = number;
            if (_scrollHeight > 0)
            {
                DisplayScrollBar.Maximum = _scrollHeight - _visibleHeight;
            }
        }
        else if (parts[0] == "scrollTop")
        {
            DisplayScrollBar.Value = number;
        }

        this.DisplayScrollBar.Visibility = this._visibleHeight >= this._scrollHeight ? Visibility.Collapsed : Visibility.Visible;
    }

    private void InitializeScrollBarScript()
    {
        try
        {
            WebBrowserControl.InvokeScript(
                "eval",
                new[]
                    {
                        "function onScroll() { " + "var scrollPosition = document.body.scrollTop;"
                        + "window.external.notify(\"scrollTop=\" + scrollPosition.toString());"
                        + "window.external.notify(\"scrollHeight=\" + document.body.scrollHeight.toString());"
                        + "window.external.notify(\"clientHeight=\" + document.body.clientHeight.toString()); } "

                        + "window.external.notify(\"scrollHeight=\" + document.body.scrollHeight.toString());"
                        + "window.external.notify(\"clientHeight=\" + document.body.clientHeight.toString()); "
                        + "window.onscroll = onScroll"
                    });
        }
        catch (Exception xcp)
        {
            Debug.WriteLine("Exception occured while executing invoke script:");
            Debug.WriteLine(xcp);
            DisplayScrollBar.Visibility = Visibility.Collapsed;
        }
    }
    #endregion
}
于 2014-09-25T19:30:04.857 に答える
0

..誰も答えていません..
しかし、私はすでに解決策を見つけました。あまり理想的ではなく、少し汚れていますが、機能し、読書の進行状況を表示できます。http://www.pitorque.de/MisterGoodcat/post/Somethings-Missing-from-the-WebBrowser-Control.aspx主なアイデアは、JavaScript をページに挿入し、スクロール イベントについてブラウザに通知することです。その後、ブラウザの近くに配置されたカスタム スクロールバー コントロールの位置を変更します。

于 2013-01-06T09:30:39.283 に答える