Добавление кнопок назад и вперед для управления веб-браузером

#c# #silverlight #windows-phone-7

#c# #silverlight #windows-phone-7

Вопрос:

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

В Cocoa UIWebView есть методы, позволяющие легко это проверить: canGoBack и canGoForward, и у вас есть доступные методы возврата и перехода (наряду с перезагрузкой и т. Д.).

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

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

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

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

Ответ №1:

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

Предполагается, что вы установили 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:

У меня есть кнопка назад, добавленная на панель приложений страницы в одном из моих приложений, которая содержит веб-браузер. Я хотел, чтобы кнопка «Назад» на панели приложений перемещала навигацию по веб-странице назад, а аппаратная кнопка «Назад» переходила на предыдущую страницу 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.Количество> 2 означает, что конкретная веб-страница, которую я показываю в веб-браузере, всегда начинается со ссылки «нажмите здесь, чтобы продолжить» на первой странице, и нет причин возвращаться туда. Это недостаток показа сайтов других людей в вашем веб-браузере — у вас нет контроля над тем, что отображается.

Комментарии:

1. Кажется все более и более вероятным, что именно так мне и придется это делать… Пользовательский интерфейс веб-браузера настолько ограничен: (

Ответ №3:

Что касается решения 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. Я читал различные сообщения о том, как тип ДОКУМЕНТА мог быть виновником, системное кэширование или IsScriptEnabled устанавливается после загрузки содержимого… Это просто никогда не работало…