.NET CF는 과도하고 참을성이없는 클릭을 방지합니다 (화면이 다시 그리는 동안)

StackOverflow https://stackoverflow.com/questions/153496

문제

.NET 소형 프레임 워크

시나리오 : 사용자가 화면에 있습니다. 장치는 프린터를 찾을 수 없으며 사용자에게 다시 시도하고 싶은지 묻습니다. "아니오"를 클릭하면 현재 화면이 닫히고 상위 메뉴 화면으로 반환됩니다. "No"버튼을 여러 번 클릭하면 No 버튼에서 첫 번째 클릭이 사용되며 화면이 다시 그리기가 완료되면 다음 클릭이 적용됩니다. (실제로 메뉴 항목을 클릭 한 다음 사용자를 다른 화면으로 데려갑니다.)

대기 커서를 넣을 좋은 곳이 보이지 않습니다 ... 사용자가 양식 폐쇄를 제외하고 "아니오"를 클릭하면 많은 일이 일어나지 않습니다. 그러나 CF 프레임 워크는 화면을 다시 그리기에 느리게합니다.

어떤 아이디어?

도움이 되었습니까?

해결책

임의의 생각 :

  • 모달 대화 상자가 올라가는 동안 부모 대화 상자의 일부 컨트롤을 비활성화하십시오. 모달 대화의 부모이기 때문에 전체 양식을 비활성화 할 수 있다고 생각하지 않습니다.
  • 또는 CF에서는 투명한 컨트롤을 사용하여 클릭을 잡을 것을 제안하지만 CF에서는 투명성이 지원되지 않습니다.
  • 상위 대화 상자에 몇 개의 컨트롤이 있습니까? 업데이트에서 느리게 CF.NET을 찾지 못했습니다. 대화 상자에 과부하가 걸리고 서브 컨트롤을 사용하여 사용자 정의를 더 빨리 그릴 가능성이 있습니까?
  • 대기 커서 추가/remvoing을 처리하기 위해 Dialogresult 속성과 클래스의 Dispose 방법을 무시하십시오.

다른 팁

Application.Doevents ()로 Windows 메시지 큐를 지우면 보류중인 클릭을 건너 뛸 수 있습니다.

다음은 다음과 같은 사용자 정의 이벤트 클래스를 사용하여 문제를 해결합니다 (여러 번의 클릭 방지 및 필요한 경우 대기 커서 표시) :

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;

이벤트 클래스는 모든 컨트롤 노출 이벤트 핸들러 이벤트 (버튼, menuitem, listview, ...)에 사용할 수 있습니다.

안부, 탐버그

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top