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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top