2008-09-30 2 views
3

.Net Compact Framework.Net CF 과도한, 참을성이없는 클릭 방지 (화면이 다시 그려지는 동안)

시나리오 : 사용자가 화면에 있습니다. 장치가 프린터를 찾지 못해 다시 시도 할 것인지 묻습니다. "아니오"를 클릭하면 현재 화면이 닫히고 부모 메뉴 화면으로 돌아갑니다. '아니오'버튼을 여러 번 클릭하면 첫 번째 클릭이 아니요 버튼에 의해 사용되며 다음 클릭은 화면이 다시 그려지면 적용됩니다. 실제로 사용자를 다른 화면으로 이동시키는 메뉴 항목을 클릭하면됩니다.

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

아이디어가 있으십니까?

답변

2

임의의 생각 : 모달 대화 상자가있는 동안

  • 부모 대화 상자에서 컨트롤의 일부를 사용하지 않도록 설정합니다. 모달 대화 상자의 부모이기 때문에 전체 양식을 비활성화 할 수 있다고 생각하지 않습니다.
  • 또는 투명 컨트롤을 사용하여 클릭 수를 잡아 내고 투명도는 CF에서 지원되지 않는 것이 좋습니다.
  • 부모 대화 상자에는 몇 개의 컨트롤이 있습니까? 업데이트가 느린 CF.Net을 찾지 못했습니다. 대화 상자에 과부하가 걸릴 수 있으며 하위 컨트롤을 사용하여 맞춤 텍스트를 더 빠르게 그릴 수 있습니까?
  • DialogResult 속성과 클래스의 Dispose 메서드를 재정 의하여 대기 커서 추가/제거 작업을 처리합니다.
+0

좋은 제안, 나에게 시도 할 수있는 몇 가지 다른 팁을 제공합니다. 고맙습니다! – Steve

+0

CF를 사용하여 적절한 투명도를 얻을 수 있지만 P/Invoke를 통해 직사각형 영역을 서로 붙입니다. 별로 예쁘지 않습니다. – Quibblesome

3

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

} 

당신은 그것을 다음 예제와 함께 작동하는지 확인할 수 있습니다 (콘솔 출력은 클릭 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, ...)를 노출하는 모든 컨트롤에 사용할 수 있습니다.

감사합니다, tamberg

+0

키 이벤트와 관련하여 CF가 동일한 게임을한다고 생각하지 않기 때문에 이상합니다. 나는 키와 비슷한 것을하려고 시도했지만, 게이트를 세우고, 쓰레드를 건너 뛰고, Application.DoEvents를 사용하여 여러 개의 키 이벤트가 발생하지 않도록 키보드 버퍼를 비우도록했다. – Quibblesome

+0

안녕하세요, 지금까지 내가 아는 한 마우스 이벤트가 GUI 스레드에서 오는 동안 키 이벤트는 다른 스레드에서 시작됩니다. – tamberg