2009-11-30 2 views
4

마지막으로 표시하는 데 몇 초가 걸리는 양식이 있습니다. 이 양식을 통해 호출됩니다C# 양식이로드되는 동안 WaitCursor

using (ResultsForm frm = new ResultsForm()) 
{ 
    this.Visible = false; 
    frm.ShowDialog(); 
    this.Visible = true; 
} 

그것은 형태가 마지막으로 표시를 기다리는 동안 나는 Cursors.WaitCursor에 기본 커서를 얻을 유용합니다. 현재 나는 단지 성공적으로 정적 '현재'속성 사용하여이 작업을 수행 할 수 있도록 보일 수있다 :

using (ResultsForm frm = new ResultsForm()) 
{ 
    //this.Visible = false; 
    Cursor.Current = Cursors.WaitCursor; 
    frm.ShowDialog(); 
    //this.Visible = true; 
} 

을하지만이 두 가지 문제가 있습니다 그것은 MainForm 숨기기 기능을 사용하지 않도록 저를 강제로

  • 을하는 나는 유지하고 싶다.
  • Cursor.Current = Cursor.Default;을 ResultsForm Shown 이벤트 내에서 호출해야하므로 커플 링이 증가합니다.

첫 번째 코드 단편을 변경하지 않고 커플 링을 피하면서 양식을로드하는 동안 어떻게 커서를 변경할 수 있습니까?

업데이트 : 이제 동영상 응답이 삭제되어 ISP 대역폭 제한을 초과하지는 않습니다.

답변

1

this.Visible = false를 제거해야하는 이유는 무엇입니까? 커서를 설정하는 동안 계속 할 수 있어야합니다.

ResultsForm을 부모 폼 대신 커서로 설정하는 것이 바람직한 해결책입니까? 모든 시간이 소요되는 코드를 시작하기 전에 커서를 설정 한 다음 끝에 다시 설정하십시오.

+0

>> 왜 당신이 this.Visible = 거짓을 제거해야합니까? << 백만 달러짜리 질문에 답이 없습니다. 나는 그렇게해서는 안된다. 현재의 동작을 보여주는 나레이션 비디오로 내 질문을 업데이트했습니다. –

+1

http://stackoverflow.com/questions/302663/cursor-current-vs-this-cursor-in-net-c 해당 질문에 대한 답변 코드를 시험해 보는 것이 좋습니다. – Glenn

+0

마지막 코멘트를 남겨 주셨습니다. 발견해 주셔서 고마워요. 나는 게시하기 전에 내 자신의 검색을했으나 그 질문을 발견하지 못했습니다. –

2

내가 유지하려는 MainForm 숨기기 기능을 사용하지 않도록 설정해야합니다.

문제없이 모두 수행 할 수 있어야합니다.

Cursor.Current = Cursor.Default 이후 커플 링이 증가합니다. ResultsForm 내에서 호출해야합니다.

ResultsForm 대화 상자 코드에 커서 논리를 완전히 넣으 려 했습니까? ResultsForm의 생성자 안에 Cursor.Current = Cursors.WaitCursor;을 설정 한 다음 이벤트 내부에 Cursor.Current = Cursor.Default;을 설정해야합니다.

이렇게하면 대화 상자에서 논리를 완전히 유지하고 주 창 밖으로 나가게됩니다. 메인 윈도우에서 가시성을 유지할 수도 있습니다.

+0

글쎄, 그게 내 처음 생각이야. 그러나 그것은 효과가 없었습니다. ResultsForm 생성자 및 표시된 이벤트로 로직을 옮기는 내 선호 솔루션이 아닙니다. 이러한 상황에서는 커서가 변경되지 않습니다. –

+1

UseWaitCursor 속성은 부울입니다. 그리고 나는 children 컨트롤에 대해서도 커서를 설정합니다. –

+0

@ Krugar : 커서를 설정 한 후에 Application.DoEvents()를 호출 해 보았습니까? –

1

이 양식을로드 할 때 대기 커서를 표시하려면 (표시 여부와 상관없이) 리드가 제시 한대로 양식 자체에서 수행해야합니다.

그러나 양식을 표시하는이 특별한 경우에만 커서가 필요한 경우 C# 2를 처리하는 경우 람다 (또는 익명의 대리자)를 사용할 수 있습니다.0) 이벤트 핸들러 :

using (ResultsForm frm = new ResultsForm()) 
{ 
    this.Visible = false; 

    var oldCursor = Cursor.Current; 
    Action<object, EventArgs> restoreCursor = 
     delegate 
     { 
      Cursor.Current = oldCursor; 
      frm.Shown -= restoreCursor; 
     }; 
    frm.Shown += restoreCursor; 

    Cursor.Current = Cursor.WaitCursor 
    frm.ShowDialog(); 
} 
+0

흥미로운 옵션. 그것의 아름다움을 위해서만 저장되었습니다 :) 어쨌든 커서는 응용 프로그램의 다른 위치에서 호출되기 때문에 커서를 폼 내에 단단히 설정해야합니다. 현재의 동작을 보여주는 나레이션 비디오로 내 질문을 업데이트했습니다. –

0

당신은 기본 폼을 두 번째 양식의 소유자를 확인하고 모달 만들 수 :

frm.ShowDialog(this); 

다음 FRM에서 "Cursor.Current = 커서를 추가합니다. WaitCursor; " 생성자에서 "Cursor.Current = Cursor.Default;"를 추가하십시오. Shown 이벤트.

저는 이것을 단추로 시도해 보았습니다.

를 Form1 :

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace WaitCursorTwoForms 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
     InitializeComponent(); 
     } 

     private void ButtonClick(object sender, EventArgs e) 
     { 
     using(Form2 form2 = new Form2()) 
     { 
      form2.ShowDialog(this); 
     } 
     } 
    } 
} 

형식 2 : 다음 대기 커서 쇼와는 폼이로드되면 기본값으로 다시 전환

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading; 

namespace WaitCursorTwoForms 
{ 
    public partial class Form2 : Form 
    { 
     public Form2() 
     { 
     Cursor.Current = Cursors.WaitCursor; 
     InitializeComponent(); 
     for (int i = 0; i < 10; i++) 
     { 
      Thread.Sleep(1000); 
     } 
     } 

     private void OnShown(object sender, EventArgs e) 
     {   
     Cursor.Current = Cursors.Default; 
     } 
    } 
} 
+0

나는 이것이 효과가 있기를 바랄 것이다. 그것은 나의 초기 코드와 유사했다. 그러나 웬일인지 그것은하지 않았다. 응용 프로그램 동작을 보여주는 나레이션 비디오로 내 질문을 업데이트했습니다. –

1

커서가 WaitCursor로 변경됩니다하지만 그 일부만 살아남을 것입니다 초. 문제는 기본 폼을 숨기면 커서가 기본 폼 뒤에있는 창과 겹치게됩니다. 또는 바탕 화면. 공개 된 창은 Windows에서 WM_SETCURSOR 메시지를 가져오고 커서를 원하는 모양으로 변경합니다.

하지만 더 큰 문제가 있습니다. 대화 상자가 닫히면 앱의 창을 볼 수없는 순간이 있습니다. Windows는 포커스를 제공 할 다른 창을 찾아야합니다. 앱의 창은 아닙니다. 기본 폼이 다시 표시되면 포커스가있는 창 뒤에 제대로 표시 될 수 있습니다. 이 동작은 약간 색다른 경향이 있습니다. 아직 찾지 못했을 수 있습니다.

당신은 윈도우에 다른 방법을 숨겨 두 문제를 해결할 수 있습니다 :

this.Opacity = 0.01; 
+0

진짜 커플 링 문제가 없습니다. 대화 상자의 표시 이벤트에 가입하면 그 이유가 표시됩니다. –

+0

Whoa nobugz.나는 당신이 그것을 쳤을지도 모른다라고 생각한다. 실제로 이것은 합리적인 설명처럼 보입니다. 하나는 내가 함께 일할 수 있습니다. 그러나 커플 링 문제는 해결되지 않습니다. 전 폼 보이지 않는 기능을 완전히 제거하고 양식 생성자에서 커서를 설정했습니다. 그러나 양식이 완전히로드 될 때까지는이 경우 변경되지 않습니다. DoEvents()도 사용합니다. –

관련 문제