3

.Net コンパクト フレームワーク

シナリオ: ユーザーは画面上にいます。デバイスがプリンターを見つけることができず、ユーザーに再試行するかどうかを尋ねます。「いいえ」をクリックすると、現在の画面が閉じられ、親メニュー画面に戻ります。「いいえ」ボタンを複数回クリックすると、最初のクリックは「いいえ」ボタンで使用され、次のクリックは画面の再描画が完了すると有効になります。(実際にはメニュー項目をクリックすると、ユーザーは別の画面に移動します。)

待機カーソルを置くのに適した場所がわかりません...ユーザーが「いいえ」をクリックしても、フォームが閉じる以外は何も起こりません。しかし、CF フレームワークは画面の再描画に時間がかかります。

何か案は?

4

2 に答える 2

3

Application.DoEvents(); で Windows メッセージ キューをクリアすることで、保留中のクリックをスキップできます。

次のカスタム Event クラスを使用して問題を解決します (必要に応じて、複数のクリックを防ぎ、待機カーソルを表示します)。

using System;
using System.Windows.Forms;

public sealed class Event {

    bool forwarding;

    public event EventHandler Action;

    void Forward (object o, EventArgs a) {
        if ((Action != null) && (!forwarding)) {
            forwarding = true;
            Cursor cursor = Cursor.Current;
            try {
                Cursor.Current = Cursors.WaitCursor;
                Action(o, a);
            } finally {
                Cursor.Current = cursor;
                Application.DoEvents();
                forwarding = false;
            }
        }
    }

    public EventHandler Handler {
        get {
            return new EventHandler(Forward);
        }
    }

}

次の例で動作することを確認できます (HandleClick が終了した場合にのみ、コンソールの出力をクリックします)。

using System;
using System.Threading;
using System.Windows.Forms;

class Program {

    static void HandleClick (object o, EventArgs a) {
        Console.WriteLine("Click");
        Thread.Sleep(1000);
    }

    static void Main () {
        Form f = new Form();
        Button b = new Button();
        //b.Click += new EventHandler(HandleClick);
        Event e = new Event();
        e.Action += new EventHandler(HandleClick);
        b.Click += e.Handler;
        f.Controls.Add(b);
        Application.Run(f);
    }

}

問題を再現するには、上記のコードを次のように変更します (コンソールはすべてのクリックを遅延して出力します)。

        b.Click += new EventHandler(HandleClick);
        //Event e = new Event();
        //e.Action += new EventHandler(HandleClick);
        //b.Click += e.Handler;

Event クラスは、EventHandler イベント (Button、MenuItem、ListView など) を公開するすべてのコントロールに使用できます。

よろしく、タンバーグ

于 2008-10-15T10:50:39.027 に答える
2

ランダムな考え:

  • モーダル ダイアログが起動している間は、親ダイアログの一部のコントロールを無効にします。モーダルダイアログの親であるため、フォーム全体を無効にできるとは思いません。
  • または、透明なコントロールを使用してクリックをキャッチすることをお勧めしますが、透明度は CF ではサポートされていません。
  • 親ダイアログにはいくつのコントロールがありますか? 更新が遅い CF.Net は見つかりませんでした。ダイアログがオーバーロードされ、サブコントロールよりも速くカスタム描画できる可能性はありますか?
  • クラスの DialogResult プロパティと Dispose メソッドをオーバーライドして、待機カーソルの追加/削除を処理します。
于 2008-09-30T15:46:50.513 に答える