Изменить переменную C # с InvokeScript - PullRequest
1 голос
/ 23 декабря 2011

Мне нужно проверить, есть ли у элемента управления WebBrowser в моем приложении для Windows Phone история, и я понял, как это сделать, используя browser.InvokeScript("eval", "if(history.length > 0){ history.go(-1) }");.Мне нужно использовать этот или другой метод для установки переменной, чтобы я мог запустить функцию, только если у WebBrowser есть история.Я не могу понять, как установить его.

Полный код, который я использую, это:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
        {

            var hasHistory = true;

            browser.InvokeScript("eval", "if(history.length > 0){ history.go(-1) }");

            if (AppSettings.Default.ExitWarning)
            {
                if (!hasHistory) {                    
                    if (MessageBox.Show("Are you sure you want to exit?", "Exit?",  MessageBoxButton.OKCancel) != MessageBoxResult.OK)
                    {
                        e.Cancel = true;
                    }
                }
            }
        }

Ответы [ 2 ]

3 голосов
/ 23 декабря 2011

Боюсь, ваш подход неверен! значение history.length нельзя использовать для обозначения страницы, на которой вы находитесь. Если вы перемещаетесь вперед, а затем назад, длина истории будет равна 2, чтобы разрешить навигацию вперед.

Я решаю эту проблему, отслеживая навигацию в коде C #:

/// <summary>
/// Handles the back-button for a PhoneGap application. When the back-button
/// is pressed, the browser history is navigated. If no history is present,
/// the application will exit.
/// </summary>
public class BackButtonHandler
{
  private int _browserHistoryLength = 0;
  private PGView _phoneGapView;

  public BackButtonHandler(PhoneApplicationPage page, PGView phoneGapView)
  {
    // subscribe to the hardware back-button
    page.BackKeyPress += Page_BackKeyPress;

    // handle navigation events
    phoneGapView.Browser.Navigated += Browser_Navigated;

    _phoneGapView = phoneGapView;
  }

  private void Browser_Navigated(object sender, NavigationEventArgs e)
  {
    if (e.NavigationMode == NavigationMode.New)
    {
      _browserHistoryLength++;
    }
  }

  private void Page_BackKeyPress(object sender, CancelEventArgs e)
  {
    if (_browserHistoryLength > 1)
    {
      _phoneGapView.Browser.InvokeScript("eval", "history.go(-1)");
      _browserHistoryLength -= 2;
      e.Cancel = true;
    }
  }
}

Как описано в этом блоге:

http://www.scottlogic.co.uk/blog/colin/2011/12/a-simple-multi-page-windows-phone-7-phonegap-example/

1 голос
/ 23 декабря 2011
hasHistory = (bool)browser.InvokeScript("eval", "return (history.length > 0);");

Метод InvokeScript возвращает object, то есть объект, возвращаемый выполненным вами сценарием.

Следующий код немного хакерский, но в большинстве случаев работает нормально.

        bool hasHistory = false;
        try
        {
            webBrowser1.InvokeScript("eval");
            hasHistory = true;
        }
        catch (SystemException ex)
        {
            hasHistory = false;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...