2009-07-11 3 views
3

WPF에서 의사 모달 대화 상자를 작성해야한다는 요구 사항이 있습니다. 즉, 소프트웨어가 모달 대화 상자를 생성 할 수없는 일부 특정 (기술) 이유로 인해 대신 사용자는 필요한 경우 "포함 된"모달 대화 상자와 상호 작용해야합니다.IsEnabled를 사용하지 않고 시각적 트리의 일부에서 키보드 및 마우스 이벤트를 비활성화하는 방법은 무엇입니까?

MVVM에서 꽤 잘 작동하고 Dispatcher 및 모달 대화 상자의 동기 문자를 처리하는 솔루션을 발견했습니다. 그러나 백그라운드 GUI에서 사용자 입력을 사용하지 못하게하는 문제가 있습니다. 모든 컨트롤을 으로 설정 IsEnabled = false은 배경 컨트롤 (회색 음영 -> 잘못된 가독성)의 시각적 상태를 변경하므로 안타깝게도 허용되지 않습니다.

시각적 상태를 변경하지 않고 백그라운드에서 사용자 입력 (포커스 및 키보드 포함)을 백그라운드에서 비활성화하는 간단한 방법이 있습니까?

도움 주셔서 감사합니다.

답변

2

github에 대한 프로젝트가 있는데, 기본 콘텐츠에 모달 콘텐츠를 표시 할 수있는 사용자 지정 FrameworkElement을 제공합니다.

제어

는 다음과 같이 사용할 수 있습니다

<c:ModalContentPresenter IsModal="{Binding DialogIsVisible}"> 
    <TabControl Margin="5"> 
      <Button Margin="55" 
        Padding="10" 
        Command="{Binding ShowModalContentCommand}"> 
       This is the primary Content 
      </Button> 
     </TabItem> 
    </TabControl> 

    <c:ModalContentPresenter.ModalContent> 
     <Button Margin="75" 
       Padding="50" 
       Command="{Binding HideModalContentCommand}"> 
      This is the modal content 
     </Button> 
    </c:ModalContentPresenter.ModalContent> 

</c:ModalContentPresenter> 

특징 :

  • 표시 임의의 내용을.
  • 모달 콘텐츠가 표시되는 동안 기본 콘텐츠를 사용하지 않도록 설정하지 않습니다.
  • 모달 내용이 표시되는 동안 기본 내용에 대한 마우스 및 키보드 액세스를 비활성화합니다.
  • 전체 응용 프로그램이 아닌 해당 응용 프로그램이 다루는 내용과 모달입니다.
  • IsModal 속성에 바인딩하여 MVVM 친화적 인 방법으로 사용할 수 있습니다.
0

부분적인 해결 방법은 "대화"컨트롤은 전체 응용 프로그램의 창을 포함 할 수 있지만처럼 중간에 불투명 한 대화 내용으로, 그것의 대부분은 투명 있습니다

+----------------+ 
|    | 
| Transparent | 
|    | 
| +----------+ | 
| | dialog | | 
| | content | | 
| +----------+ | 
|    | 
+----------------+ 

하지만, 그 해킹 비트입니다.

질문에 직접 대답하기 위해 컨트롤의 IsEnabled 속성에서 트리거를 사용하여 색이 바뀌지 않도록 할 수 있습니다. 아마도 상자에 Visual Studio가있는 사람이 코드 샘플을 제공 할 수 있습니다. 귀하의 코멘트에 :

응답 :

나는이 답변이 조금 까다로운 점점 걱정,하지만 당신은 그 동작을 얻을 수 있도록 컨트롤에 false로 IsTabStop 포커스 가능한 속성을 설정할 수 있습니다.

+0

응답 해 주셔서 감사합니다. 불행히도 투명 레이어를 앱에 넣는 것은 솔루션의 절반에 불과합니다 (현재 내가있는 위치). 내 문제는 투명 레이어 아래의 레이어에서 키보드 포커스를 비활성화하는 것입니다. 투명 서페이스 아래에있는 컨트롤로 탭할 수도 있습니다 :-) –

+0

IsTabStop 및 Focusable 속성을 컨트롤에 false로 설정하면 해당 동작을 얻을 수 있지만 ...이 솔루션은별로 우아하지 않습니다. – exclsr

3

저는 같은 문제 (MVVM)에 어려움을 겪고 있습니다. 또한 모달 팝업 대신 UserControl 오버레이를 사용하고 있습니다. (내 경우, 비활성화 된 스타일이 아니기 때문에 IsEnabled = false를 싫어하지만 IsEnabled를 사용하면 키보드 포커스를 다시 얻지 못하기 때문에).

마우스 동작을 차단하는 데 오버레이 솔루션 (위)을 사용하고 있습니다. . 그리고 "솔루션의 나머지 절반"에 대한 - 키보드 입력을 -disabling - I 메인 창에서이 나눠 해요 :

 

Window 
+----------------+ private void Window_PreviewKeyDown(object sender, 
|    |          KeyEventArgs e){ 
| Transparent |  if (this.myDialog.Visibility == Visibility.Visible){ 
|    |   e.Handled = true; 
| +----------+ |  } 
| | myDialog | | } 
| | content | | 
| +----------+ | 
|    | 
+----------------+ 

4

당신은 그 제어/창으로 어떤 마우스 클릭을 비활성화 .IsHitTestVisible 속성을 설정할 수 있습니다. 이 설정은 .IsEnabled 설정과 동일하지만 시각적 인 상태 변경 (회색 컨트롤)은 적용되지 않습니다.

+0

마우스 이벤트 만 차단합니다. 키보드를 사용하여 배경 컨트롤의 이벤트를 실행할 수 있습니다. –

관련 문제