이번 포스트는 UWP 앱 숙원 2탄으로 멀티 인스턴스에 대한 내용을 다루어 보도록 하겠습니다.


ps. 어제 우리나라는 지고, 오늘 일본은 이겼군요.....ㅡ,.ㅡ



1. 참고

https://docs.microsoft.com/ko-kr/windows/uwp/launch-resume/multi-instance-uwp



2. 멀티 인스턴스 앱을 만들기 위한 준비


멀티 인스턴스 앱을 만들기 위해서는 Multi-Instance App Project Templates.VSIX를 설치하고, 그 템플릿을 이용해서 앱을 만들어 주어야 합니다.


다운로드


물론 기존 앱에도 package.appxmanifest 파일을 수동으로 수정해서 만들 수 있을 것으로 생각됩니다.




3. 프로젝트 생성


프로젝트를 생성하는 화면에 2개의 템플릿이 추가됩니다. 


1) Multi-Instance Redirection UWP app

앱의 시작점에서 인스턴스 생성하거나, 기존 인스턴스 중에 하나를 선택해서 활성화 시키는 앱을 만듭니다.


2) Multi-Instance UWP app

일반적인 멀티 인스턴스 UWP 앱을 생성합니다.



4.  Package.appxmanifest


         xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4"
xmlns:iot2="http://schemas.microsoft.com/appx/manifest/iot/windows10/2" 

...

<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="KakiViewer.App" desktop4:SupportsMultipleInstances="true" iot2:SupportsMultipleInstances="true">

...



package.appxmanifest 파일에서 굵은 글씨 부분이 새로 추가된 기능입니다. 또한, 위위의 내용처럼 이 멀티 인스턴스 앱은 데스크탑과 IoT에서만 가능하다는 것을 알 수 있습니다.



5. KakiViewer 프로젝트의 키 포인트!


이미지 뷰어를 만들어 보았습니다.


1) 프로젝트 버전 설정


Target version, Min version 모두 Windows 10, version 1803로 선택하셔야 합니다.


2) 확장자 연결


Package.appxmanifest의 Declarations 탭에서 File Type Associations를 추가해서 png 파일과 연결을 했습니다.


3) 파일 열기 프로그램으로 실행된 경우 처리


App.xaml.cs


        protected override void OnFileActivated(FileActivatedEventArgs args)
        {
            if (!(Window.Current.Content is Frame rootFrame))
            {
                rootFrame = new Frame();
                Window.Current.Content = rootFrame;
            }
            if (rootFrame.Content == null)
            {
                var parameter = string.Empty;
                if (args.Files.Any())
                    parameter = args.Files[0].Path;
                rootFrame.Navigate(typeof(MainPage), parameter);
            }
            Window.Current.Activate();
        }


파일 열기로 앱이 시작되면 OnFileActivated를 구현해야 합니다. 그리고, 전달 받은 파일의 정보는 오직 Path만 알 수 있내요... 그 이상의 정보를 알아내는 방법은 현재 상황에서는 모르겠습니다. 디버그를 통해서 직접 확인하세용


4) 이미지 파일을 열어서 표시하는 방법


            var firstFile = await StorageFile.GetFileFromPathAsync(filePath);
            if (firstFile == null) return;

            using (var stream = await firstFile.OpenReadAsync())
            {
                var bi = new BitmapImage();
                bi.SetSource(stream);
                Image.Source = bi;
            }


에..여기서 firstFile이 StorageFile형태이기는 한데..파일의 정보를 알 수는 없습니다.

아마 보안 사항이기 때문일지도..ㅡㅡ;;; 머징..


아니면, filePath 중 폴더 정보만 빼내서 폴더 정보를 먼저 가지고 오고 그 폴더에서 파일을 찾아서 가져오면 상세 정보도 알 수 있을 듯 합니다. 물론 이 경우 지난 포스트에서 다루었던 broadFileSystemAccess을 사용해야 합니다.


5) 디버그 하는 방법


프로젝트 속성 -> Debug -> Start action -> Do not launch, but debug my code when it starts를 체크하고 디버그로 실행 합니다.


파일 탐색기에서 png 파일을 마우스 오른쪽 버튼으로 눌러서 열기 할 프로그램을 선택하시면 디버그가 가능 합니다.



6. 소스

https://github.com/kaki104/UWP_17134


블로그 이미지

kaki104

/// Microsoft MVP - Windows Development 2014 ~ 2019 5ring /// twitter : @kaki104, facebook : https://www.facebook.com/kaki104 https://www.facebook.com/groups/w10app/

티스토리 툴바