質問

.Net Compact Framework

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

待機カーソルを置くのに適した場所が表示されません...ユーザーが[いいえ]をクリックしてもあまり起こりません。フォームを閉じることを除きます。ただし、CFフレームワークは画面の再描画に時間がかかります。

アイデアはありますか

役に立ちましたか?

解決

ランダムな考え:

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

他のヒント

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

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

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);
        }
    }

}

次の例で動作することを確認できます(Consoleは、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;

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

よろしく、 タンバーグ

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top