2010-10-27 9 views
5

Buduję aplikację GPS, która wyświetla współrzędne pośród innych obliczeń. Mój kod demo jest skonfigurowany tak, aby uruchamiać zdarzenia co sekundę.Dlaczego strona panoramiczna WP7 przeskakuje podczas aktualizacji?

Ilekroć aktualizuję interfejs strony głównej (powiedzmy pole tekstowe z obliczoną Latitude), działa poprawnie.

Problem polega na tym, że próbuję "pstryknąć" z jednej strony na drugą stronę, aby zmienić stronę. W trakcie "pukania", jeśli pole tekstowe miało zostać zaktualizowane, przeskakuje z powrotem na główną stronę.

Trudno wyjaśnić w tekście bez wideo. Ale wyobraź sobie, że trzymasz kliknięcie i nieco powiększasz ekran panoramiczny - powiedzmy, aby zerknąć na następną stronę, ale jeszcze nie odwracając. Cóż, jeśli pole tekstowe miało zostać zaktualizowane w tym czasie, utraciłbyś przytrzymanie klawisza myszy i powróciłby do strony głównej.

Po przejściu do następnej strony pozostaje i widzę przepełnienie aktualizacji z poprzedniej strony. Nic wielkiego. Ale po prostu próbuję dostać się do następnej strony.

Jestem nowy w WP7/Silverlight, więc staram się korzystać z Dispatchera, aby poprawić jego działanie. Bez względu na to, co robię (używając Dispatchera lub nie), zawsze tak się dzieje. Zgaduję, że ma to związek z aktualizacją interfejsu użytkownika.

Trochę kodu zawsze pomaga:

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; 

} 

Gdy któryś z tych pól tekstowych są aktualizowane, ekran „skacze” powrót do strony głównej. Coś złego doświadczenia.

Może to normalne? Czy jest jakieś wydarzenie, na które można się zorientować, że użytkownik próbuje "przesuwać" do następnej strony?

Z góry dziękuję.

Odpowiedz

1

Cóż, to wygląda jak włamanie. Ale dostałem opóźnienie, które chciałem, włączając się w pewne wydarzenia. Jeśli są inne zdarzenia, których powinienem używać (np. Mousedown/mouseup), daj mi znać. Ponownie, to jest hack, ale działa.

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; 
    }); 
} 

Wszystko, co muszę teraz zrobić, to sprawdzić boolean isChangingPage w moim kodzie. I przekazać je do wydarzeń itp

1

Przypuszczam, że po ustawieniu .Text na wszystkich tych obiektów bezpośrednio ich otrzymaniu ostrość (lub coś podobnego).

Spróbuj użyć wiązania z danymi do ustawiania wartości.
Robię to z powodzeniem, aby zaktualizować tekst formantów w obiektach PanoramaItem, których nie ma w widoku.

Powiązane problemy