2009-04-27 5 views
0

대화 상자를 모달로 표시하는 방법은 없지만 숨기지 않고 모덜이 아닌 대화 상자로 변경하는 동안 표시되도록하려면 어떻게해야합니까?'부분적으로'모달 대화 상자를 만들려면 어떻게해야합니까?

대화 상자를 표시하는 방법을 차단하는 대화 상자를 표시하려고합니다. 그런 다음 사용자가 대화 상자에서 '마침'버튼을 클릭하면 내가 원하는 것입니다 :

  • 대화 상자가 계속 표시됩니다.
  • 대화 상자가 표시된 메서드로 돌아가려면 Ctrl 키를 누릅니다.

별도의 STA 스레드에서 대화 상자를 실행하고 '마침'을 누를 때까지 기본 UI 스레드를 차단하는 이벤트를 사용하여이 결과를 얻었지만이 방법에 대한 제한이 있습니다. 대화 상자가 표시되어있는 동안 '주'창의 닫기 버튼에, 대화 상자가 숨겨져있을 때 주 윈도우가 닫힙니다.

업데이트

지금까지 답변 해 주셔서 감사합니다. 죄송합니다 - 배경이 너무 넉넉하지 않고 균형이 맞지 않은 것처럼 보입니다.

이 양식은 사실상 모달 '마법사'대화 상자입니다.이 응용 프로그램은 주 응용 프로그램 앞에 모달로 표시되고 숨겨집니다. 따라서 사용자가 걱정하는 한 비표준 이상한 일은 없습니다. 유일한 차이점은 대화 상자가 UI 스레드의 일련의 콜백에 의해 구동된다는 것입니다. 그래서 평생 동안 ShowDialog를 호출하여이를 모달 화하지 않을 것이라고 생각하지 않습니다. 첫 번째 콜백은 대화 상자를 표시 한 다음 사용자가 대화 상자 UI를 통해 대화 상대를 설정하는 동안 차단해야합니다. 그런 다음 UI 스레드에서 다양한 다른 콜백이 수행되는 동안 대화 상자가 계속 표시되고 진행률 막대 페이지를 표시합니다. 결국 양식이 숨겨집니다. 양식이 실행되는 동안 사용자가 기본 창과 상호 작용하지 않습니다. 그들이 관여하는 한 주요 UI 스레드와 100 % 모달로 보일 것입니다.

(양식은 Visual Studio 마법사 용 대화 상자입니다.이 양식은 UI 스레드의 일련의 콜백에서 생성됩니다. 다른 방법으로는 대화 상자를 표시하고 숨기고 즉시 최상위 '진행률'양식을 표시 한 다음 숨길 수 있습니다. 단 하나의 대화 상자를 표시하는 것이 사용자에게 더 자연스러운 경험이라고 생각합니다.

다시 말씀 드리지만 혼란 스럽습니다.

답변

0

상호 작용의 차단 단계에서 메인 UI 스레드에서 보이지 않는 모달 대화 상자를 보여주는 것이 효과적이라는 것을 알게되었습니다.

ShowInTaskBar = false, FormBorderStyle = None, size = {0,0}, Opacity = 0 %, StartupPosition = CenterParent. 모달 대화 상자의 숨김 설정 (보이지 않음).

숨겨진 대화 상자는 ShowDialog를 사용하여 UI 스레드에 표시됩니다. 표시되는 대화 상자는 별도의 STA 스레드에 표시됩니다. 스레드는 기본 UI 스레드에서 hiddenDialog.ShowDialog를 호출하기 전에 시작됩니다.

초기 차단 상태를 완료하려고 할 때 보이는 대화 상자가 hiddenDialog를 숨 깁니다. 그러면 기본 UI 스레드가 차단되지 않습니다. 코드의

중요한 비트 :

void LaunchWizardForm(s) 
{ 
    // Show the wizard on its own thread. 
    ThreadStart t =() => 
    { 
    _wizard = new WizardForm(s); 
    Application.Run(new ApplicationContext(_wizard)); 
    }; 
    var thread = new Thread(t); 
    thread.SetApartmentState(ApartmentState.STA); 
    thread.Start(); 

    // Block this (main UI) thread 
    _hiddenForm.ShowDialog(); 
} 

void EndModalEpisode() 
{ 
    _hiddenForm.Invoke((Action) (() => _hiddenForm.Hide())); 
} 
+0

당신은 불투명도와 조심해야합니다, 그것은 원격 데스크톱 및 일부 (그래도 쓰레기) 비디오 카드를 통해 실패 할 수 있습니다 – johnc

6

아마도 상호 작용 모델을 재고하고 싶습니까? 이 사실을 사용자에게 어떻게 설명 할 예정입니까? 그들은 컴퓨터 프로그램의 작동 방식에 대한 내재화 된 모델을 가지고 있으며, 당신은 그것을 깨뜨리는 아주 좋은 이유가 있습니다. 그들은 모달 대화 상자에 대해 알고 있고, 모달이 아닌 대화 상자에 대해 알고 있으며, 검사원에 대해 알고 있습니다. 하나를 선택하고 적용하십시오.

모달 대화 상자는 단기간 상호 작용을 위해 만들어졌습니다. 응용 프로그램을 종료하지 못하도록 막지 않아야합니다. 사용자는 상호 작용을 제어하며, 프로그램은 필요한 최소한의 제한 만 제공합니다.

[설명 후 대체] 모달 대화 상자에 진행률 막대를 표시하는 것은 무엇이 문제입니까? 확인 버튼 을 클릭하면 처리가 시작됩니다. 모든 버튼을 비활성화하고 취소 버튼을 활성 상태로 유지 하시겠습니까? 시간이 오래 걸리면 사용자가 작업을 중단 할 수 있습니다. 처리가 끝나면 대화 상자를 닫으십시오.

+0

은 잘만 자세한 설명은 사용자 상호 작용을 명확히하는 데 도움이됩니다. – mackenir

+0

확실히 모달 대화 상자입니다. 새 프로젝트를 만들 때 사용자로부터 설정을 얻고 프로젝트가 생성되는 동안 진행률 표시 줄을 표시합니다. – mackenir

1

사용자가 모덜리스 대화 상자를 사용한 다음 사용자가 완료 버튼을 클릭했는지 확인하는 데 사용할 수 있습니다. 모덜리스 대화 상자가 열려 있지만 Finished가 클릭되지 않은 경우 기본 폼의 사용자 동작에 응답하지 않습니다 ...

1

이것은 완전히 비표준적인 동작이며 모든 종류의 농구를 뛰어 다니며 사용자를 혼란스럽게 만들 것입니다.

0

나는 다른 것들을 방해하는 앱의 측면 또는 하단에서 플라이 아웃을 만들 수 있습니다. 사용자가 볼 필요가 있거나 상호 작용할 필요가있는 다른 것들 위에 있다면 문제를 일으킬 것입니다.

1

대부분의 다른 답변과 마찬가지로 대부분의 사용자에게 혼란을주는 비표준 UI 요소를 구현합니다.

데이터에 대한 읽기 전용 액세스를 제공하기 위해 대화 상자가 계속 표시되는 경우 대화 상자 창이 정상적으로 닫히지 않고 대화 상자 창의 데이터로 응용 프로그램의 사이드 바 창을 열지 않는 이유는 무엇입니까?

대화 상자가 계속 표시되어 사용자가 업데이트를 계속 진행할 수 있다면 처음에는 모달이 아니어야합니다.

포인트는 표준 UI 메타포를 위반하지 않고 작업을 수행 할 수있는 몇 가지 방법이 있습니다.

관련 문제