2012-03-24 3 views
6

ShowDialog()WindowStyle = WindowStyle.SingleBorderWindow;과 함께 사용하여 WPF (MVVM) 응용 프로그램에서 모달 창을 열지 만 Windows 작업 표시 줄 (Windows 7)을 사용하여 부모 창으로 이동할 수 있습니다.부모 창 뒤에 ShowDialog()

여기에 답변을 찾았습니다 : WPF and ShowDialog()하지만 "항상 맨 위"도구 창이 필요하지 않기 때문에 적합하지 않습니다. 사전에

감사

답변

9

대화 상자의 Owner 속성을 설정하십시오. 그게 효과가있다.

Window dialog = new Window(); 
dialog.Owner = mainWindow; 
dialog.ShowDialog(); 

편집 : 내가 MVVM 이것을 사용하여 비슷한 문제가 있었다. 위임자를 사용하여이 문제를 해결할 수 있습니다.

public class MainWindowViewModel 
{ 
    public delegate void ShowDialogDelegate(string message); 
    public ShowDialogDelegate ShowDialogCallback; 

    public void Action() 
    { 
     // here you want to show the dialog 
     ShowDialogDelegate callback = ShowDialogCallback; 
     if(callback != null) 
     { 
      callback("Message"); 
     } 
    } 
} 

public class MainWindow 
{ 
    public MainWindow() 
    { 
     // initialize the ViewModel 
     MainWindowViewModel viewModel = new MainWindowViewModel(); 
     viewModel.ShowDialogCallback += ShowDialog; 
     DataContext = viewModel; 
    } 

    private void ShowDialog(string message) 
    { 
     // show the dialog 
    } 
} 
+0

감사합니다. 이 시점에서 유일한 문제는 ViewModel에서 뷰에 대한 정보가 없다는 것입니다. 나는'App.Current.MainWindow'를 시도했지만 제대로 작동하지는 않았다. 어쩌면 내 MVVM 패턴의 구조를 재고해야합니다. – Oszkar

+1

MVVM 문제에 대한 가능한 해결책을 추가했습니다. – MatthiasG

+0

@Oszkar 나는'Application.Current.MainWindow' (응용 프로그램 대신 응용 프로그램)을 사용했고, 정적이기 때문에 MVVM을 괴롭게하지 않고도 정상적으로 작동했습니다. – heltonbiker

0

"ShowInTaskbar"를 추가하고 false로 설정하십시오.

1

부모 창에서 자식 창을 만들고 표시하면 소유자를 설정해야합니다. 당신은 모든 어린이들을위한 별도의 작업 표시 줄 ...

<Window x:Class="ChildWindow"   
     ShowInTaskbar="False" > 
</Window> 
+0

'this'가 Window가 아닌 ​​경우는 어떻게됩니까? MFC에서 WPF를 실행 중이므로 응용 프로그램 또는 기본 창이 없습니다. –

+0

무엇을 열려고합니까? 대화 상자를 표시 하시겠습니까? 대화 상자를 창에 연결하지 않으려는 경우 사용자의 질문을 이해할 수 없습니다. – 00jt

+0

내가 말했듯이 "from MFC"... MFC 클래스는 WPF의 Window에서 파생되지 않습니다. 나는 최근에 WindowInteropHelper.Owner를 발견했습니다 ... 심지어 그걸로 우리는 숨겨진 모달 다이얼로그로 끝납니다. –

2

을 원하지 않는 경우

public partial class MainWindow : Window 
{ 

    private void openChild() 
    { 
     ChildWindow child = new ChildWindow(); 
     child.Owner = this; // "this" is the parent 
     child.ShowDialog(); 
    } 
} 

Aditionally, 나는이 문제를했지만, 창으로 I didn를 뷰 모델에서 열 받고 현재 창에 대한 참조가 없습니다.

var myWindow = new MyWindowType(); 
myWindow.Owner = Application.Current.Windows.OfType<Window>().SingleOrDefault(x => x.IsActive); 

당신은 사용할 수 있습니다 : myWindow.Owner = Application.Current.MainWindow;

그러나,이 방법은 문제가 발생하면 다음과 같은 열 세 개의 창문이있는 경우 :

MainWindow 
    | 
    -----> ChildWindow1 

       | 
       -----> ChildWindow2 

그런 설정 ChildWindow2 그것을 피해 갈 수있는 방법이 코드를 사용 .Owner = Application.Current.MainWindow는 창 소유자를 부모 창이 아닌 조부모 창으로 설정합니다.

0

이 게시물이 조금 오래된 경우에도 제 솔루션을 게시하는 것이 좋습니다. 위의 모든 결과는 나에게 알려져 있으며 원하는 결과를 정확하게 산출하지 못했습니다.

나는 다른 Google 직원을하고있는 중이 야 :)

는 F2는 F1의 상단에 표시 할 창문 말할 수 있습니다 : 그것 뿐이다

f2.Owner = Window.GetWindow(this); 
f2.ShowDialog(); 

을, 나는 그것이 사라지지 약속 ! 상호 작용 논리 단위 테스트 할 수 있도록 MVVM 패턴에 대한 이유의

0

많은

HTH 사람입니다. 이런 이유로 ViewModel에서 직접 창을 열면 안됩니다. 아니면 단위 테스트 도중에 대화 상자가 나타납니다.

대신보기에서 처리 할 이벤트를 발생시켜 대화 상자를 열어야합니다.예를 들어 상호 작용 요청에 대한이 기사를 참조하십시오. https://msdn.microsoft.com/en-us/library/gg405494(v=pandp.40).aspx#sec12