#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 устанавливается после загрузки содержимого… Это просто никогда не работало…