Por que a página panorâmica do WP7 salta para a atualização?
-
26-09-2019 - |
Pergunta
Estou construindo uma aplicação relacionada ao GPS que exibe as coordenadas entre outros cálculos. Meu código de demonstração está configurado para disparar os eventos a cada segundo.
Sempre que atualizo a interface do usuário da página principal (digamos, uma caixa de texto com a latitude calculada), ela funciona bem.
O problema é se eu tentar "sacudir" de um lado para o outro lado, para alterar a página. Enquanto estava no processo de "Flicking", se a caixa de texto atualizar, ele saltará a página principal de volta à exibição.
É difícil explicar no texto sem um vídeo. Mas imagine o clique-n-holding e escorrendo a tela panorâmica um pouco-digamos, para espiar na próxima página, mas ainda não está lançando. Bem, se a caixa de texto atualizasse durante esse período, você perderia o mouse-click-Hold e voltaria para a página principal.
Depois de chegar à próxima página, ela permanece e eu posso ver a atualização do estouro da página anterior. Não há grande coisa lá. Mas está apenas tentando chegar à próxima página.
Eu sou novo no WP7/Silverlight, então tenho tentado usar o despachante para tornar as coisas mais receptivas. Não importa o que eu faça (usando o despachante ou não), isso sempre acontece. Então, acho que isso tem a ver com a interface do usuário ser atualizada.
Um pequeno código sempre ajuda:
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;
}
Quando qualquer uma dessas caixas de texto é atualizada, a tela "salta" de volta para a página principal. Uma espécie de experiência ruim.
Talvez isso seja normal? Existe um evento para se conectar a saber que o usuário está tentando "deslizar" para a próxima página?
Desde já, obrigado.
Solução
Bem, isso parece um hack. Mas recebi o atraso que queria, conectando alguns eventos. Se houver outros eventos que eu deveria estar usando (por exemplo, Mousedown/MouseUp), me avise. Novamente, isso é um hack, mas funciona.
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;
});
}
Tudo o que preciso fazer agora é verificar o booleano de ischangingpage no meu código. E passe para eventos, etc.
Outras dicas
Eu acho que quando você definir .Text
Em todos esses objetos diretamente, eles estão recebendo foco (ou algo semelhante.)
Tente usar o banco de dados para definir os valores.
Faço isso com sucesso para atualizar o texto dos controles em panoramaitems que não estão em vista.