퇴근5분전

 

 WPF 로딩창... 이틀 힘들었넹..

 

 

 

BTN을 누르면 로딩창이 떠서 돌다가 프로세스가 끝나면 창이 닫힌다!

 

이 기능을 구현하는데 ... WPF로 하려니 대박.. ㅡ.,ㅡ;; 뭐가 이렇게 안되는게 많지? ( 모르는 걸꺼야... )

 

조건 :

  1. GIF 의 로딩 애니메이션과 관련해서 배경이 투명임.

  2. 오래 걸리는 프로레스처리 기간동안 화면에 떠서 땡글 땡글 돌고 있어야 한다.

  3. 처리가 완료되면 자동으로 닫혀야 한다.

 

여기서 WPF로 쉽게 접근해본다고...

 

처음 WebBrowser로 시작 Resource에 넣었는데... WebBrowser에 전달을 어떻게 하지?...

Html문서로 만들면... 이미지를 어딘가 올려놔야 될텐데.. 로컬경로라 해도... 배포문제도 있공...

좀 해보다가 Pass

 

다음 구글링 하니 MediaElement 로 하는게 있는데 이것도 리소스랑 연결을 못해서 ... ㅡ.ㅡ;;

 

또 winform의 PictureBox 이건 간단하게 되었다.

 

단... 여기서 완전 삽질 시작...

WPF.Window창에 설정을 마치고

     WindowsFormsHost 에 PictureBox를 넣고 리소스를 연결했다.

          GIF의 바탕이 원래 투명인데!!!

          윈도우 창의 AllowsTransparency="True" 를 설정하고 폼을 띄우니 배경이 흰색이 나온다!

          흰색을 없애보려고 별짓다하다가 두손두발 들었다.

     

그래서 Winform을 프로젝트에 추가해서 PictureBox에 이미지를 넣었다.

 

로딩폼을 띄웠다가 접었다 해야되는데!!!

 

구글링 하면 WPF 관련해서 여러가지 뜨는데...

 음...  처음부터 그냥 윈폼처럼 구현할것을... WPF라고 죄다 찾다가 삽질만...

덕분에 좀더 많이 뒤져봤지만...

 

 

 # WPF - Window 와 Form 부모창 셋팅할수 있는 방법

 http://stackoverflow.com/questions/1095763/how-to-set-a-wpf-window-as-the-owner-of-a-winforms-form

 

 # 단순 비동기 대리자 호출만으로 뺑글뺑글이 안되서 쓰레드!

   WPF ... 쓰레드... 허허

   

 -- 그나마 코드를 많이 손본 소스!

 

            trd = new System.Threading.Thread(() =>
            {
                w = new ProgressBarForm();
                w.FormClosed += delegate {
                      System.Windows.Threading.Dispatcher.CurrentDispatcher.InvokeShutdown();  // Step2
                };
                w.Show();
                System.Windows.Threading.Dispatcher.Run();  // Step1

                int a = 0; // Step3

            });
            trd.SetApartmentState(System.Threading.ApartmentState.STA);
            trd.IsBackground = true;
            trd.Start();

 

 이 쓰레드가 돌면 w.Show 한 후 Run에서 블럭이 걸린다.

 와... 이걸 몰라서 계속 a = 0으로 안빠져서 이 쓰레드가 미쳤나 했다.

폼이 닫힐때 Step2에서 ShutDown 되면 그때서야 빠진다.

 

이건 또 다른 방법 어차피 똑같음!

 

            trd = new System.Threading.Thread(() =>
            {
                System.Windows.Threading.DispatcherFrame df = new System.Windows.Threading.DispatcherFrame();
                w = new ProgressBarForm();
                w.FormClosed += delegate {
                    df.Dispatcher.InvokeShutdown(); // Step2
                };
                w.Show();
                System.Windows.Threading.Dispatcher.PushFrame(df);  // Step1

                int a = 0;  // Step3

            });
            trd.SetApartmentState(System.Threading.ApartmentState.STA);
            trd.IsBackground = true;
            trd.Start();

 

음 WPF 프로젝트니까 처음 Xaml로 시작했다가 결국엔 윈폼이네...

 

GIF 배경색이 투명으로만 나왔어도 쉽게 가는거였는뎅...

 

구글링에 삽질에... 암튼..

 

정비 하고 또 테스트 하고 하다보니 ...

 

 결국엔 윈폼 코드가 되버렸넹.. 크크..

생각보다 WPF 어려운데... 낼부터 좀더 파고들어봐야징.

  -- 최종 소스 ㅡ.ㅡ;? 

            trd = new System.Threading.Thread(() =>
            {
                ProgressBarForm w = new ProgressBarForm();
                Func<System.Windows.Forms.DialogResult> showDialogDelegate = w.ShowDialog;
                showDialogDelegate.BeginInvoke(ir => showDialogDelegate.EndInvoke(ir), null);

                IsRunning = true;

                while (IsRunning) System.Threading.Thread.Sleep(234);

                w.Invoke(new Action(() =>
                {
                    using (w)
                    {
                        w.Close();
                    }
                    w = null;
                }));
            });
            trd.SetApartmentState(System.Threading.ApartmentState.STA);
            trd.IsBackground = true;
            trd.Start();

 

-- 소스는 ( 숨겨둠! )