2016-10-31 4 views
0

私はWPFをかなり新しくしていて、アプリケーションのボタンを一時的に無効にする簡単なソリューションを探しています。WPFアプリケーションでボタンを一時的に無効にするにはどうすればいいですか?

ボタンをクリックして:

private void Calculate_Click(object sender, RoutedEventArgs e) 
    { 
     this.AreButtonsEnabled = false; 
     System.Threading.Thread.Sleep(1000); 
     this.AreButtonsEnabled = true;  
    } 

XAML:ここで私がやっているものです

<Button x:Name="OtherButton" IsEnabled="{Binding AreButtonsEnabled}" Content="OtherButton" HorizontalAlignment="Left" Margin="165,152,0,0" VerticalAlignment="Top" Width="75"/> 

期待通りに結合作品を、私は有効にし、この1回の呼び出しでボタンを無効にすると、非アクティブ化は行われません。ボタンを適切に非アクティブにするためのGUIの取得方法を教えてください。

EDIT

(正常に動作します)通知イベント:

public partial class MainWindow : Window, INotifyPropertyChanged 
    { 

    private bool areButtonsEnabled; 
    public bool AreButtonsEnabled 
    { 
     get { return this.areButtonsEnabled; } 
     set { areButtonsEnabled = value; OnPropertyChanged(new PropertyChangedEventArgs("AreButtonsEnabled")); } 
    } 

私は、.NET 3.5にバインドされています。

+0

あなたが "AreButtonsEnabled" プロパティが宣言されている方法を投稿してもらえますか? –

+1

おそらく、UIがスリープする前に 'AreButtonsEnabled'の設定にfalseに反応する時間がないからでしょう。 – ChrisF

+0

RelayCommand –

答えて

1

仕事をし、最後にボタンを有効にするには、別のスレッドを使用して/ボタンを無効にしてから起動する方がよいかもしれません(これを実行する1つの方法を1つの方法では、async/awaitを使用しています)、UIは責任を持って最新の状態に保たれます。

擬似コード:

private async void Calculate_Click(object sender, RoutedEventArgs e) 
{ 
    AreButtonsEnabled = false; 
    await Task.Run(()=>DoWork()); 
    AreButtonsEnabled = true;  
} 
+1

[StartNewは危険です](http://blog.stephencleary.com/2013/08/startnew-is-dangerous.html)。 Task.Run()を使うのが良いです。 – Clemens

+0

申し訳ありませんが、私はネットフレームワーク3.5に拘束されていることを忘れていました。しかし、私は考えを得る。私は新しい仕事を始めることが選択肢になると思っています。特に時間のかかる仕事のためです。しかし私は、ユーザーがブロックされたGUI(時間間隔1〜2秒)を持つことが許容される範囲では広範ではない、タスクの解決策があると考えましたか? – Kroetenwurz

+0

@Kroetenwurz - マイクロソフトは、50ミリ秒以上にわたってUIをブロックするものはすべて「悪い」とみなしています。また、シナリオではUIを更新する必要があります(これは元の質問です)。同時に、コードはUIスレッドに作業を依頼しています。 –

1

Thread.Sleep()は、UIスレッドをブロックします。代わりにTask.Delay()asyncクリックハンドラを使用することがあります。

private async void Calculate_Click(object sender, RoutedEventArgs e) 
{ 
    AreButtonsEnabled = false; 
    await Task.Delay(1000); 
    AreButtonsEnabled = true;  
} 
+0

のような基本的な実装でICommandインターフェイスを使用することをお勧めします。申し訳ありませんが、私はネットフレームワーク3.5にバインドされていることを忘れていました。しかし、私は考えを得る。タスク(スリープ)に入る前にGUIを強制的にアップデートすることはできますか? – Kroetenwurz

+1

UIで 'Thread.Sleep'を呼び出さないでください。決して。代わりに、いくつかの非同期操作を行うことができます。 [BackgroundWorker](https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v = vs.110).aspx)を参照してください。 – Clemens

+0

ヘイ・クレメンス。スリープは、1〜2秒かかるタスクのプレースホルダーです。ユーザーが別のボタンを押すだけで十分ですが、私が防止したいものは – Kroetenwurz

関連する問題