2012-02-20 7 views
2

「確認」ボタンがあります。クリックすると内容が「確認中...」に変更され、処理が完了すると「確認済」と表示されます。これをどのように達成すべきでしょうか?私はwpfに新しいです。どんな助けもありがとう。ボタンをクリックするとコンテンツが元の状態に戻ります。

private void btnVerify_Click(object sender, RoutedEventArgs e) 
{ 
    btnVerify.Content = new BitmapImage(new Uri("Verifying.png", UriKind.Relative)); 
    VerifyData(); // this takes almost few seconds to few minutes 
    btnVerify.Content = new BitmapImage(new Uri("Verified.png", UriKind.Relative)); 
} 
+1

は、あなたがすべてで何を試してみましたので、あなたは、あなたが立ち往生している場所へとコードを提供することができますか? –

+0

プライベートvoid btnVerify_Click(オブジェクト送信者、RoutedEventArgs e) { btnVerify.Content = new BitmapImage(新しいUri( "Verifying.png"、UriKind.Relative)); VerifyData(); \t \t //これはほんの数秒から数分かかります \t btnVerify.Content = new BitmapImage(新しいUri( "Verified.png"、UriKind.Relative)); \t} – user1222006

+1

@ user1222006 - 次回に自分の質問にコードを投稿し、読みやすく理解しやすいようにコードマークアップ(各行の先頭に4つのスペース)を使用してください。ありがとう。 – IAmTimCorey

答えて

0

あなたはWPFを初めて使うので、私はあなたがMVVMを使用していないと仮定しています。その場合:

フックClickイベントへと方法で:

OnVerifyClick(object sender, RoutedEventArgs e) 
{ 
    Button verifyButton = sender as Button; 
    if(verifyButton == null) { return; } 

    verifyButton.Content = "Verifying..."; 
    DoProcessing(); 
    verifyButton.Content = "Verified";  
} 
+0

あなたは正しいです、私はMVVMについてはわからないし、それを通過します。 ところで、私は以下のコードを試していました。 プライベートvoid btnVerify_Click(オブジェクト送信者、RoutedEventArgs e) { btnVerify.Content = new BitmapImage(新しいUri( "Verifying.png"、UriKind.Relative)); VerifyData(); \t \t \t btnVerify.Content =新しいBitmapImage(新しいUri( "Verified.png"、UriKind.Relative)); \t} – user1222006

+0

これは、 'VerifyData()'コードが非常に速く実行されている可能性があります。 'VerifyData()'の直後に 'System.Threading.Thread.Sleep(3000); –

0

ここではあまり働くことはありませんが、私はあなたの質問に答えることができると思います。私が見ているように、これを行う簡単な方法がいくつかあります。

まず、ボタンのテキストを変更するプロセスの最後に、ボタンのテキストをもう一度[確認]に変更するだけで済みます。例:

OnClick() 
{ 
    Button.Text = "Verifying..."; 
    DoSomething(); 
} 

DoSomething() 
{ 
    ... 
    Button.Text = "Verify"; 
} 

この方法の問題は、すばやく汚れていることです。あなたがビュー(ユーザーインターフェイス)をコードで直接変更していることを前提としています。また、DoSomethingメソッドもビューを操作できると想定しています。ベストプラクティスではありませんが、シンプルです。

もう1つの方法は、処理が完了したときにイベントを発生させることです。あなたのフォーム(またはViewModel)はイベントが発生するのを待ち受け、ボタンのテキスト値を "Verify"に戻すことができます。特にMVVMのようなものを使用していて、ViewModelでこの作業を行う場合は、これはもう少しベストプラクティスです。 ViewModelからボタンのテキストを取得することができるので、最初に、最後に変更することができます。

編集 あなたが投稿した最新情報から、画面の再表示に問題があるようです。これは、プロセス全体が完了するまで更新をロックしている同期プロセスを実行している可能性が高いためです。これを回避する一つの方法は、(ハック)ここに記載されている指示に従うことになります:

http://geekswithblogs.net/NewThingsILearned/archive/2008/08/25/refresh--update-wpf-controls.aspx

私はむしろあなたはしかし、より多くのスレッドに優しいように、このコードをリファクタリング見るであろう。プロセスが待機中のインジケータ(「検証中...」など)を表示するのに十分な時間がかかる場合、実際の作業を処理するためにバックグラウンドワーカーまたは他の種類の非同期プロセスを使用することをお勧めしますUIはロックされません。しかし、それは初心者として学びたいことの範囲を超えているかもしれないより高度なトピックです。もしそうなら、私は上記のハックを今のところやっているか、単に問題を抱えて生きていることを提案します。

+0

Biggsありがとうございましたが、何らかの形でイベントのクリック時にプロセス全体が完了したときにボタンテキストを更新しています。私は何か不足していますか? – user1222006

+0

質問にあなたのやっていることを示すコードを投稿できますか?おそらくあなたは正しい手順をすべて実行しているようですが、プロセスが完了して変更される前に画面が更新されて「確認中...」と表示されないことがあります。これは、同期プロセスを実行した結果です。そのようなものを修正することはもう少し複雑になります。 – IAmTimCorey

+0

コードを続行する前に、テキストの変更を処理するようアプリケーションに指示する必要があります。例えば、あなたは次のようなものを呼び出すことができます:System.Windows.Forms.Application.DoEvents –

関連する問題