2011-07-01 13 views
0

私はWindows Phone 7アプリケーションでアプリケーションバーを作成しようとしています。 しかし、時々動作し、ときどき動作しないので、クリックイベントにいくつか問題があると思います。Windowsのアプリケーションバー7

以下はxaml.csのコードです。

XAML

<shell:ApplicationBar IsVisible="True" IsMenuEnabled="False"> 
     <shell:ApplicationBarIconButton IconUri="/Icons/appbar.edit.rest.png" Text="Edit" Click="btnEdit_Click" IsEnabled="True"/> 
     <shell:ApplicationBarIconButton IconUri="/Icons/appbar.delete.rest.png" Text="Delete" Click="btnDelete_Click" IsEnabled="True"/> 
     <shell:ApplicationBarIconButton IconUri="/Icons/appbar.feature.email.rest.png" Text="Email" Click="btnEmail_Click" IsEnabled="True"/> 
     <shell:ApplicationBarIconButton IconUri="/Icons/appbar.back.rest.png" Text="Back" Click="btnBack_Click" IsEnabled="True"/> 

    </shell:ApplicationBar> 
</phone:PhoneApplicationPage.ApplicationBar> 

は.cs

void btnBack_Click(object sender, EventArgs e) 

    { 
     NavigationService.Navigate(new Uri("/Library.xaml", UriKind.Relative)); 
    } 

    void btnDelete_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("Can click"); 
    } 

誰がそれを私を助けることができます。ありがとう。

+0

あなたは、そのページで(PhotoChooserTaskのような)任意のランチャーまたはチューザーを呼び出していますか? – keyboardP

+0

ランチャーまたはチューザーを呼び出していません –

答えて

1

私が考えることができる1つの可能性のある状況は、ライブラリページには重いコンストラクタがあり、そのページへのナビゲートには時間がかかります。このような状況では、ボタンを2回3回タップすると錯覚することがあります。最初のものが既に起動されているのにスレッドがまだ次のページを作成しようとしている間に、動作していないと思われます。

この推測が正しいかどうかを確認するには、ナビゲーションの代わりに非常に単純なメッセージボックスを試してください。

可能であれば、ページコンストラクタをできるだけ軽く作成し、データを "Asynchronus"と "OnNavigatedTo"で読み込みます。

データロードの場合: ライブラリページにロードするアイテムのリストを読み込んでいる可能性があります。アイテムを読み込むには、ファイルシステム、Webサービス、または他のメディアから読み込む必要があります。これは時間がかかり、UIをブロックする可能性があります。あなたは、(ユーザーがページにナビゲートされた後、それを起動することを確認する)OnNavigatedToでそれを行うと非同期に、次のようにする必要があります。

public override void OnNavigatedTo(...) 
{ 
    System.Threading.ThreadPool.QueueUserWorkItem(LoadData); 
} 

void LoadData(object o) 
{ 
    res = // load data from media. 
    Deployment.Current.Dispatcher.BeginInvoke(() => 
    { 
     // add res to your page 
    }); 
} 

あなたがあなたのページの後ろにコードに直接書き込む何を除いて(UIスレッド上で実行されるだろうアニメーションは別のスレッドで処理されます)。したがって、UIに関連しないタスクを別のスレッドに保持する必要があります(上記の方法で)。

UIスレッドでUI変更を引き続き発生させる必要がある場合は、「Corss-thread exception」が表示されることに注意してください。 (なぜ我々はDispatcher.BeginInvokeでコードを呼び出すのですか)。

+0

申し訳ありません私のデータロードAsyncusをどういう意味ですか? –

+0

新しいコメントが追加されました –

関連する問題