2012-10-04 5 views
0

가능한 중복에서 :
Notification when WPF UI closes열기 WPF 설정 창은 양식 앱

내가 전에 매우 비슷한 질문을했다,하지만 난 어떤 가능한 응답을하지 않았다. 나는 누군가가 저를 도울 수 있기를 바라고 있습니다.

Windows Form 앱으로 프로그래밍 된 기존 트레이 응용 프로그램이 있습니다. WPF로 프로그래밍 된 기존 설정 양식이 있습니다.

트레이 응용 프로그램은 다음을 수행 할 수 있어야합니다. * 한 번에 하나의 인스턴스 만 열어서 설정 응용 프로그램을 n 번 엽니 다. * 사용자가 설정 응용 프로그램을 닫으면 알림을받습니다.

설정 App은 ResourceDictionary를 사용합니다. 이는 App.xaml에서 시작해야한다는 것을 의미합니다.

설정 창을 한 번 열어 다음 코드를 사용하여 종료 할 때 트레이에 알릴 수는 있지만 다시 열 수는 없습니다.

 if (gui == null) 
     { 
      //shell = new mainWindow(); 
      //shell.CloseEvent += settings_FormClosed; 

      gui = new App(); 
      //gui.ShutdownMode = ShutdownMode.OnExplicitShutdown; 
      gui.MainWindow = shell; 
      gui.InitializeComponent(); 
      //gui.Run(); 
      gui.Exit += new System.Windows.ExitEventHandler(settings_FormClosed); 

      IsUIOpen = true; 
     } 

위 줄의 주석을 제거하면 닫기 이벤트를 가로 채고 공개 설정을 숨김으로 설정할 수 있습니다. 다음에 사용자가 설정을 선택하면이를 다시 표시로 설정할 수 있습니다. 그러나 설정을 처음 열면 Exit 이벤트가 시작되지 않고 셸에서 모든 ReferenceDictionary를 가져 오지 못하거나 액세스하지 못하고 있으므로 창이 제대로 표시되지 않습니다.

응용 프로그램에서 WPF를 실행하고 MainWindow에 액세스 할 수있는 방법이 있습니까? (종종 null 인 것으로 보이고 자체 창 유형이 아닙니다) 사용자 정의 수신기를 mainWindow에 추가 할 수 있습니까?

다른 방법으로 정적 응용 프로그램을 처리 할 수있는 방법이 있으므로 다음에 사용자가 설정을 클릭 할 때 다시 인스턴스화 할 수 있습니다.

WP 폼을 Win Forms에서 훌륭하게 사용하려면 몇 가지 방법이 있어야한다는 것을 알고 있습니다. 도와 주신 모든 분들께 감사드립니다. 이것은 저에게 두통을주었습니다.

답변

1

설정이 응용 프로그램이므로 WinForms 응용 프로그램 내에서 System.Diagnostics.Process를 사용하여 WPF 설정 응용 프로그램을 시작합니다. Window로 호출하지 않고 설정을 응용 프로그램으로 시작하기 때문에 스타일이로드됩니다. 또한 프로세스의 WaitForExit() 또는 WaitForExit (int) 메서드를 사용하면 설정 응용 프로그램이 완료 될 때까지 Winforms 응용 프로그램으로 제어권을 반환하지 않고 설정 응용 프로그램이 완료 될 때까지 기다릴 수 있습니다. 이 설정은 설정 앱을 닫을 때 요청 된 알림으로도 사용됩니다. 설정 WPF APP OPENS 경우에도

: 여기

가 빠른 코드 SNIPPIT의 주 스레드에서 WaitForExit를 호출하여

Process myProcess = new Process(); 
myProcess.StartInfo.UseShellExecute = false; 
myProcess.StartInfo.FileName = "C:\\mysettingsapp\\mysettingsapp.exe"; // replace with path to your settings app 
myProcess.StartInfo.CreateNoWindow = false; 
myProcess.Start(); 
// the process is started, now wait for it to finish 
myProcess.WaitForExit(); // use WaitForExit(int) to establish a timeout 

을의 윈폼 응용 프로그램은로 설정 앱을 기다리고 차단 완전한. 이렇게하면 사용자가 두 개 이상의 설정 창을 열 수 없게됩니다. Winforms 앱에 비 차단 요구 사항이 표시되지 않았습니다. 그래서 당신이 막을 수 없다면 나는 다른 길을 찾아 낼 수 있습니다.

이 실행 어셈블리의 경로 잡아 UPDATE :

string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); 
+0

가 감사를; 이것은 훌륭한 대답이었다. 코드를 차단하고 싶지는 않지만 별도의 스레드에 추가하여이를 처리 할 수 ​​있습니다. 나는 하나의 질문을 가지고 있습니다 : 절대 경로를 제공하지 않고 이것을 할 수있는 방법이 있습니까? WPF는 내 솔루션의 프로젝트입니다. 그 대신 참조 할 수있는 방법이 있습니까? 다시 한 번 귀하의 답변에 감사드립니다. 이것은 며칠 동안 나를 괴롭혔다! – Tim

+0

전체 경로를 제공해야한다고 생각합니다. 그러나 솔루션의 일부인 경우 Assembly 객체가 실행 경로를 가져 와서 거기에서 설정 앱으로 빌드 할 수 있습니다. 위의 답변을 형식이 표시되도록 업데이트되었습니다. – Josh

+0

당신은 최고입니다. 나는 너의 대답을 하나 이상 부딪 칠 수 있었으면 좋겠다. 정말 고맙습니다! – Tim