Добавление кнопки «назад» и «вперед» для управления WebBrowser - PullRequest
1 голос
/ 24 октября 2011

У меня есть элемент WebBrowser на странице, к которому я хотел бы добавить кнопки «Назад» и «Вперед», и отключить эти кнопки, когда не к чему возвращаться и к чему идти.

В Какао UIWebView имеет методы для простой проверки: canGoBack и canGoForward, и у вас есть доступные методы goBack и goForward (наряду с перезагрузкой и т. Д.)

В Android есть точно такие же имена методов для достижения того же самого.

Я вижу, что эти методы доступны в .Net 4 и 3.5 SP1.

Я нашел несколько ссылок на использование команд javascript в Silverlight, но я нахожу это очень громоздким, плюс нет никакого способаопределить, есть ли что-то в истории (если, конечно, я сам не справлюсь с этим)

Конечно, в Windows Phone есть что-то более продвинутое ...

Ответы [ 3 ]

7 голосов
/ 25 октября 2011

Вот как я это сделал.

Предполагается, что вы установили backButton и forwardButton; статус этих кнопок будет обновляться соответственно в зависимости от того, где вы находитесь в стеке навигации.

webView это WebBrowser объект

List<Uri> HistoryStack;
int HistoryStack_Index;
bool fromHistory;

// Constructor
public HelpView()
{
    InitializeComponent();
    HistoryStack = new List<Uri>();
    HistoryStack_Index = 0;
    fromHistory = false;
    webView.Navigated += new EventHandler<System.Windows.Navigation.NavigationEventArgs>(WebView_Navigated);
    UpdateNavButtons();
}

private void backButton_Click(object sender, RoutedEventArgs e)
{
    if (HistoryStack_Index > 1)
    {
        HistoryStack_Index--;
        fromHistory = true;
        webView.Navigate(HistoryStack[HistoryStack_Index-1]);
        updateNavButtons();
    }
}

private void forwardButton_Click(object sender, RoutedEventArgs e)
{
    if (HistoryStack_Index < HistoryStack.Count)
    {
        HistoryStack_Index++;
        fromHistory = true;
        webView.Navigate(HistoryStack[HistoryStack_Index-1]);
        UpdateNavButtons();
    }
}

private void UpdateNavButtons()
{
    this.backButton.IsEnabled = HistoryStack_Index > 1;
    this.forwardButton.IsEnabled = HistoryStack_Index < HistoryStack.Count;
}

private void WebView_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
    if (!fromHistory)
    {
        if (HistoryStack_Index < HistoryStack.Count)
        {
            HistoryStack.RemoveRange(HistoryStack_Index, HistoryStack.Count - HistoryStack_Index);
        }

        HistoryStack.Add(e.Uri);
        HistoryStack_Index++;
        UpdateNavButtons();
    }

    fromHistory = false;
}
2 голосов
/ 24 октября 2011

Мне добавили кнопку «Назад» на панель приложений на странице в одном из моих приложений, которое содержит веб-браузер.Я хотел, чтобы кнопка «Назад» на панели приложений переместила навигацию по веб-странице назад, и хотела, чтобы кнопка «Назад» была доступна на предыдущей странице xaml.Таким образом, пользователю не нужно использовать аппаратную кнопку «Назад» для перемещения назад по всем посещенным веб-страницам в веб-браузере, чтобы вернуться на предыдущую страницу xaml.Вот как я это сделал, и вы могли легко настроить стек вперед, и когда пользователь нажимает кнопку возврата (панель приложений), страница выскакивает из этого стека и перемещается в стек вперед.

        private void NavigateWeb()
        {
              if (!loaded)
              {
                    NavigationStack.Clear();
                    try
                    {
                          Web.Source = new Uri("http://m.weightwatchers.com/");
                          loaded = true;
                    }
                    catch (Exception ex)
                    {
                          MessageBox.Show("Unable to navigate to page.\n" + ex.Message,
                                "Error", MessageBoxButton.OK);
                    }
              }
        }

        void Web_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
        {
              NavigationStack.Push(e.Uri);
        }


        void btnBack_Click(object sender, EventArgs e)
        {
              if (NavigationStack.Count > 2)
              {
                    // get rid of the topmost item...
                    NavigationStack.Pop();
                    // now navigate to the next topmost item
                    // note that this is another Pop - as when the navigate occurs a Push() will happen
                    Web.Navigate(NavigationStack.Pop());
              }
        }

Причина, по которой я проверяю NavigationStack.Count> 2, заключается в том, что конкретная веб-страница, которую я показываю в веб-браузере, всегда начинается со ссылки «нажмите здесь, чтобы продолжить» на первой странице, и нет причин возвращаться к ней.,Это ошибка показа сайтов других людей в вашем веб-браузере - вы не можете контролировать то, что показано.

0 голосов
/ 24 октября 2011

Что касается решения JavaScript, оно делает что-то вроде этого:

    private void backButton_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            webView.InvokeScript("eval", "history.go(-1);");
        }
        catch
        {
            // Eat error
        }

    }

    private void forwardButton_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            webView.InvokeScript("eval", "history.go(1);");
        }
        catch
        {
            // Eat error
        }
    }

с присвоением IsScriptingEnabled значения true для элемента WebBrowser. Тем не менее, это всегда генерирует исключение с ошибкой 80020006. Я читал различные посты о том, как DOCTYPE мог быть виновником, системное кэширование или установка IsScriptEnabled после загрузки контента ... Просто не работало ...

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