5

他の計算の中で座標を表示する GPS 関連のアプリケーションを構築しています。私のデモ コードは、毎秒イベントを発生させるように設定されています。

メイン ページの UI (たとえば、計算された緯度を含むテキスト ボックス) を更新するたびに、正常に動作します。

問題は、ページを変更するために、片側から反対側に「フリック」しようとした場合です。「フリック」の過程で、テキストボックスが更新された場合、メインページが表示されます。

動画なしで文字で説明するのは難しいです。しかし、クリックしたままにして、パノラマ画面を少しだけドラッグすることを想像してみてください。たとえば、次のページをのぞき見しますが、まだめくっていません。その間にテキスト ボックスが更新されると、マウスのクリックを押したままにしておく必要がなくなり、メイン ページに戻ってしまいます。

次のページに移動すると、そのまま残り、前のページからオーバーフローが更新されていることがわかります。大したことはありません。しかし、それは次のページに到達しようとしているだけです。

私は WP7/Silverlight を初めて使用するので、Dispatcher を使用して応答性を高めようとしています。私が何をしても (Dispatcher を使用するかどうかに関係なく)、これは常に発生します。だから、これはUIが更新されていることに関係していると推測しています。

少しのコードが常に役に立ちます:

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;

}

これらのテキストボックスのいずれかが更新されると、画面はメイン ページに「ジャンプ」して戻ります。ちょっと悪い経験。

多分それは正常ですか?ユーザーが次のページに「スライド」しようとしていることを知るためにフックするイベントはありますか?

前もって感謝します。

4

2 に答える 2

1

うーん、これはハックのように感じます。しかし、いくつかのイベントにフックすることで、必要な遅延が得られました。他に使用すべきイベント (マウスダウン/マウスアップなど) がある場合は、お知らせください。繰り返しますが、これはハックですが機能します。

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 ブール値をチェックするだけです。そして、イベントなどに渡します。

于 2010-10-27T00:59:04.633 に答える
1

.Textこれらすべてのオブジェクトを直接設定すると、それらはフォーカスを受け取っていると思います(または同様のものです。)

データバインディングを使用して値を設定してみてください。
これを正常に実行して、表示されていない PanoramaItems のコントロールのテキストを更新します。

于 2010-10-27T09:48:03.947 に答える