2012-04-02 2 views
1

ボタンをクリックした後、一定期間、すべてのイベントの実行(クリック)を無効にする必要があります。その特定の期間に、何個のボタンをクリックしても、ボタンの機能は実行されません。 Thread.Sleep()を使用することはできません。なぜなら、実行を遅らせるだけなので、ボタンの機能はまだ実行されています。 any1は助けることができますか?私のコードはここにあります:一定期間のすべての実行を無効にする

int delay = 2000; //unusable as it is just delaying the execution of clicked button. 
public void PressCOM(string key) 
    { 
     if (key == "PressSc") 
     { 
      PressAndRelease(key); 
      PressAndRelease("C"); 

      Thread.Sleep(delay); 
     } 
+4

あなたがいないのであればあなたが疑問に思う必要があります – Kolky

+0

@Kolky - 私もそうだと思っていましたが、時には顧客が奇妙なことを尋ねています:)ボタンが再び有効になっていれば、再入力されない 'というメッセージが表示されます。どちらか、または入力を操作にキューイングすると、ボタンをまったく無効にする必要はありません。 –

+0

はい、私はボタンをクリックした後にClick forボタンを無効にして何か間違っていません。わずかな時間しかかかりません。私はいくつかのユーザーインターフェイスの目的のために、このコードが必要です。 – hakunabean

答えて

4

とにかく寝てしまいました。あなたがいずれかのボタンに関するいくつかのロジックで構築する必要があります

  • それらを無効にはクリック

タイマーによってリセットされるブール型プロパティを使用を無視します。

+0

フォーム/パネル/ボタンの親が何であれ、全体を無効にすることはできますか? wpfでわからない –

0

可能な解決策は、ダイアログを表示し、ダイアログの非表示、キャンセル、および閉じるボタンを非表示にすることです。これにより、メインウィンドウ内のどのボタンもクリックされなくなります。

+0

私はこれについても考えましたが、それは良い方法ではありません..... – hakunabean

2

の無効化とユーザーへのメッセージの「お待ちください...」の種類を示すことは良いオプションになります...

あなたが

を好きなようにあなたは、パネルWPFで.Gridsを無効にし、有効にすることができます

私は通常、ユーザがUIとやりとりするのを止めるためのメッセージでAdorner Overlay(半透明)を使用します。通常、Backroundワーカーは、必要に応じてオーバーレイを表示および非表示にします。

This will be a Good Artice for Adorner implemtation in XAml

...それが役に立てば幸い:)

2

それはあなたが何をしたいのか本当にはっきりしていません。

メインのアプリケーションスレッドでスリープ状態にするのは良い考えではありません。これは、アプリケーションがすべてのWindowsメッセージ(ユーザーまたはWindows自体によって生成される)に対して応答しなくなるようにします。ユーザーがハングアップします。

このボタンだけを無効にする必要がある場合は、IsEnabledプロパティをfalseに設定すると、ユーザーはそのボタンをクリックできません。

すべてのイベントを無効にする場合は、ウィンドウ自体のIsEnabledプロパティを使用できます。

すべてのコントロール(または1つのボタン)を無効にするのが適切なソリューションでない場合は、次のいずれかを使用できます。

状態変数(または単純なフラグ)を追加します。すべてのイベントハンドラで、その変数が真であるかどうかをチェックします(タイマーで変更します)。ような何か:

if (!_canHandleMouseClicks) 
    return false; 

無効にし、一定期間後にすべてのボタンと再度有効にそれら:

private static IEnumerable<Button> FindAllButtons(DependencyObject obj) 
{ 
    if (obj == null) 
     return null; 

    int childrenCount = VisualTreeHelper.GetChildrenCount(obj); 
    for (int i = 0; i < childrenCount; ++i) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(obj, i); 

     if (child != null && child is Button) 
      yield return (Button)child; 

     // If you may have buttons inside buttons then uncomment these lines 
     //foreach (Button childOfChild in FindAllButtons(child)) 
     // yield return childOfChild; 
    } 
} 

次にあなたが書くことができます。

foreach (Button button in FindAllButtons(window)) 
    button.IsEnabled = false; // true to re-enable 
+0

Thxは、情報のためですが、私のボタンは画像で構成されていますので、私の場合はurコードがうまくいかないと思います。しかし、URコードは将来の参照として使用することができます。 – hakunabean

+0

コントロールタイプ(ボタンの代わりに画像または他のもの)を置き換えてください... –

関連する問題