Почему страница WP7 Panoramic отскакивает назад при обновлении?

Я создаю приложение, связанное с GPS, которое отображает координаты среди других вычислений. Мой демонстрационный код настроен на запуск событий каждую секунду.

Всякий раз, когда я обновляю пользовательский интерфейс главной страницы (скажем, текстовое поле с рассчитанной широтой), он работает нормально.

Проблема в том, что если я попытаюсь «перелистнуть» с одной стороны на другую, чтобы изменить страницу. В процессе «пролистывания», если текстовое поле должно было обновиться, оно возвращает главную страницу обратно в поле зрения.

В тексте без видео сложно объяснить. Но представьте себе нажатие и удержание и небольшое перетаскивание панорамного экрана — скажем, чтобы посмотреть на следующую страницу, но еще не листать. Ну, если бы текстовое поле обновлялось в это время, вы бы потеряли удерживание щелчка мыши, и оно вернулось бы на главную страницу.

Как только вы ДЕЙСТВИТЕЛЬНО переходите на следующую страницу, она остается, и я вижу обновление переполнения с предыдущей страницы. Ничего страшного. Но он просто пытается добраться до следующей страницы.

Я новичок в WP7/Silverlight, поэтому я пытался использовать Dispatcher, чтобы сделать вещи более отзывчивыми. Что бы я ни делал (используя Диспетчер или нет), это всегда происходит. Итак, я предполагаю, что это связано с обновлением пользовательского интерфейса.

Небольшой код всегда помогает:

void GeoWatcher_PositionChanged(object sender,
    GeoPositionChangedEventArgs<GeoCoordinate> e)
{
    Deployment.Current.Dispatcher.BeginInvoke(() => MyPositionChanged(e));
}
void MyPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e)
{
    var model = GeoProcessor.GetPosition(e.Position);

    latitude.Text = model.Latitude;
    longitude.Text = model.Longitude;
    altitude.Text = model.Altitude;
    accuracy.Text = model.Accuracy;
    direction.Text = model.Direction;
    speed.Text = model.Speed;
    speedAvg.Text = model.SpeedAvg;

}

Когда любое из этих текстовых полей обновляется, экран «прыгает» обратно на главную страницу. Какой-то неудачный опыт.

Может это нормально? Есть ли событие, к которому можно подключиться, чтобы узнать, что пользователь пытается «перейти» на следующую страницу?

Заранее спасибо.


person eduncan911    schedule 27.10.2010    source источник


Ответы (2)


Ну, это похоже на взлом. Но я получил задержку, которую хотел, подключившись к некоторым событиям. Если есть другие события, которые я должен использовать (например, mousedown/mouseup), дайте мне знать. Опять же, это хак, но работает.

bool isChangingPage = false;
bool isCompleting = false;

public MainPage()
{
    InitializeComponent();
    this.Loaded += new RoutedEventHandler(MainPage_Loaded);

    this.ManipulationStarted += 
        new EventHandler<ManipulationStartedEventArgs>(MainPage_ManipulationStarted);
    this.ManipulationCompleted += 
        new EventHandler<ManipulationCompletedEventArgs>(MainPage_ManipulationCompleted);
}

void MainPage_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
{
    isChangingPage = true;
}

void MainPage_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
    if (isCompleting)
        return;
    isCompleting = true;

    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        Thread.Sleep(1000);
        isChangingPage = false;
        isCompleting = false;
    });
}

Все, что мне нужно сделать сейчас, это проверить логическое значение isChangingPage в моем коде. И передать его событиям и т.д.

person eduncan911    schedule 27.10.2010

Я предполагаю, что когда вы устанавливаете .Text на все эти объекты напрямую, они получают фокус (или что-то подобное).

Попробуйте использовать привязку данных для установки значений.
Я делаю это успешно, чтобы обновить текст элементов управления в PanoramaItems, которые не отображаются.

person Matt Lacey    schedule 27.10.2010