2012-10-24 2 views
6

요즘 Android를 공부하고 있으며 그 기능 중 하나를 C# compact 프레임 워크로 이식하려고했습니다.다음에 양식을 닫으려고하면 C#으로 표시됩니다. # cf

내가 한 것은 Activity라고하는 추상 클래스를 만드는 것입니다. 이 클래스는 내가 가진 문제는 Show() 명령

기본적으로 내 모든 클래스가 위의 클래스를 구현의 일부를 실행하는 것입니다이

internal abstract class Activity 
    { 
     protected Form myForm; 
     private static Activity myCurrentActivity = null; 
     private static Activity myNextActivity = null; 

     internal static void LoadNext(Activity nextActivity) 
     { 
     myNextActivity = nextActivity; 
     if (myNextActivity != null) 
     { 
      myNextActivity.Show(); 
      if (myCurrentActivity != null) 
      { 
       myCurrentActivity.Close(); 
       myCurrentActivity = null; 
      } 
      myCurrentActivity = myNextActivity; 
      myNextActivity = null; 
     } 
     } 

     internal void Show() 
     { 
     //PROBLEM IS HERE 
     Application.Run(myForm); 
     //myForm.Show(); 
     //myForm.ShowDialog(); 
     // 
     } 

     internal void Close() 
     { 
     myForm.Close(); 
     } 


     internal void GenerateForm() 
     { 
     ///Code that uses the Layout class to create a form, and then stores it in myForm 
     //then attaches click handlers on all the clickable controls in the form 
     //it is besides the point in this problem 
     } 

     protected abstract void Click(Control control); 
     //this receives all the click events from all the controls in the form 
     //it is besides the point in this problem 

    } 

과 같은 XML 파일을로드하고 표시합니다. 나는 (ACMain에서 ACLogIn에가는 예를 들어) 나는 다음 양식을로드 보여, 현재 양식을 언로드하도록되어이 코드

Activity.LoadNext(new ACLogIn); 

를 사용하는 새로운 클래스/형태로 전환 할 때

는 I합니다 (Show() 방법) 이들 솔루션을 시도하고 여기 myForm.ShowDialog() ,321를 사용하여 각

  1. 가진 한 문제 0이 작동하지만, 블록의 실행 이전 형태 근접하지 않는 것을 의미하고, 더욱 I이 작동 myForm.Show()
    를 사용하여 더 처리 스택 증가

  2. 형태 사이에서 움직 후의 구 형태를 닫고 이전이 표시되어 있지만, 프로그램을 종료하고 종료 직후

  3. 내가 다음 양식으로 이동할 때이로드 첫 번째 양식에서만 작동 Application.Run(myForm)
    를 사용하여, 그것은 "그 다음 말에서 예외가 발생 보여줍니다 값이 예상 범위를 벗어납니다. "

누군가가 문제를 해결하거나 대안을 찾도록 도와 줄 수 있습니까?

+1

주요 문제는 1 개의 기본 양식 만 가질 수 있다는 것입니다. Aplication에 쓰기 가능한 MainForm 속성이 있는지 확인한 다음 Show()에 해당 속성을 사용하십시오. –

답변

5

이 탐색을위한 고유 한 프레임 워크를 실제로 만든 후에는 생각을 다시해야합니다. Application.Run으로 전달 된 양식 인스턴스는 절대로 닫아서는 안됩니다. Application.Run이 실행을 완료하면 static void Main 진입 점이 종료되고 앱이 종료됩니다. 부모 모든

public abstract class Activity : UserControl 
{ 
    .... 
} 

또는 대신 폐쇄 그러던 어느

public abstract class Activity 
{ 
    private UserControl m_control; 
    .... 
} 

를 구성하고 양식을 보여주는 :

내가 제안 할 것은 당신이 중 하나가 UserControl이되는 당신의 활동을 변경하는 것이있다 기본 폼 내부의 활동을 컨테이너로 사용합니다.

공정한 경고로서, 스택 대신 탭 모티프로 항목을 표시하거나보기를 분할하고 싶을 때 복잡해집니다. 프레임 워크는 간단하게 만들 수 있지만 그렇게하지 않으면 자신의 롤업을 원하는 강력한 이유가 없으면 적어도 이미 수행 된 작업을 사용하는 것이 좋습니다.

+0

그 생각은 내 친구, 실제로 똑똑하다. 내 생각에 그것에 대해 생각하지 않으면 매우 어리 석다. 실제로 다음 글을 닫기 전에 새로운 형태를 여는 것보다 낫다. – Cruces

+0

나는 나의 모든 필요한 변화를 만들었다. 프로젝트 귀하의 아이디어를 통합하기 위해 프로젝트 지금은 하나의 양식을 보여주고 패널에 패널 대신 양식을 추가했습니다. (여기서는 소형 프레임 워크를 사용 했으므로 여기에 약간 이상한 점이 있습니다) 그리고 그것을 추가 한 후에 나는 이전 것을 제거하고 완벽하게 작동합니다. 프로세스 스택은 항상 비어 있으며,로드 시간은 절반으로 줄었습니다. 다시 감사드립니다. 어떻게 내가 너에게 별을 줄 수 있니? 흠, 알아낼거야 (: – Cruces

1

Application.Run은 일반적으로 Form 매개 변수를 사용하는 오버로드와 함께 사용됩니다. 이것은 다른 양식을 시작/보여줄 책임이있는 "주요"양식입니다. 이 "기본"양식은 "숨겨져있을"수 있습니다. 그러나, 나는 그것이 조금 어색하다고 생각한다.

또는 이 필요하지 않은 경우 Application.Run()을 사용하여 Windows 메시지를 처리 ​​할 수 ​​있습니다. 그러나 스레드가 메시지 처리 중일 때 대화 상자를 표시 할 수 없습니다 (스레드는 Application.Run이어야 함). 당신은이 Application.Run를 호출하고 이러한 형태의 객체는 양식 Run에 대한 호출 후 표시되도록 Timer.Tick 이벤트 핸들러에 Form.Show() 또는 Form.ShowDialog()를 호출 할 것 Timer 객체를 생성하기 전에 하나 이상의 형태의 객체 를 작성하면이 문제를 해결할 수 있습니다. 나는 이것이 조금 어색하다고 생각한다.

두 가지 솔루션 모두 Windows 및 WinForms를 사용하는 방식을 우회합니다. Windows와 .NET이 작동하는 방식으로 작동하려면이 응용 프로그램을 다시 디자인해야한다고 생각합니다.

관련 문제