GSI

'WPF 프로젝!!/GsiSee'에 해당되는 글 2건

  1. 2007.09.13 Step1 - Thread 적용(Invoke, delegate) 1
  2. 2007.09.13 Start!! - GsiSee

사용자 삽입 이미지

[작업 경위]

--xaml 파일--
1. Blend를 사용해서 기본 베이스 제작
   - 해당 경로를 입력 받을 수 있도록 TextBox를 추가
   - 경로 이미지를 가져 오기 위한 Button를 추가
   - 이미지를 보여 주기 위한 ListBox를 추가
2. 템플릿 변경
   - ListBox > StackPanel > TextBlock
                                       Border > Image
     위와 같이 파일 이름과 이미지를 보여 주기 위한 테플릿을 하나 제작하였다.
     이 부분은 상세하게 적지 않는다. (lynda 페이지의 blend 항목에 가면 자세히 나와 있음)
3. 리스트 정보를 저장할 CLR 클래스를 하나 생성한다.
   - Name, Path 정보를 담고 있는 클래스이며, 배열로 사용하기 위해서 ObservableCollection 를 사용하였다.
   - xaml 파일로 클래스 연동시킨다.
     xmlns:c="clr-namespace:GsiImageView" //클래스 네임스페이스 추가
     <Window.Resources>
        <c:PathInfoList x:Key="pathData" /> //를 추가 한다.

--cs 파일--                
1. 스레드를 사용하기 위해서 네임 스페이스 추가
   - using System.Threading;
2. xaml 파일의 버튼 클릭 이벤트를 생성한다.
        private void OnFolderOpenClick(object sender, RoutedEventArgs e)
        {
            Thread loadThread = new Thread(new ThreadStart(DataLoad));
            loadThread.Start();
            Thread.Sleep(1);
        }
3. 스레드에 사용할 함수를 하나 만든다. 이 함수내부에서 폴더 내의 이미지를 읽어서 작업 하도록 한다.
        private void DataLoad()
        {
            .....
        }
4. 메인 스레드의 인스턴스된 객체를 접근 하기 위해서 delegate를 선언한다.
        public delegate void UpdateImage(string _path);
5. Invoke에 사용할 함수를 추가 한다.
        public void UpdateImageList(string _path)
        {
            PathInfoList pathinfolist = (PathInfoList)this.FindResource("pathData");
            pathinfolist.Add(new PathInfo(_path, "none.jpg"));
        }
6. DataLoad() 함수 안에 내용을 추가 한다.
        private void DataLoad()
        {
            //디렉토리 경로 가져 오기
            DirectoryInfo di = new DirectoryInfo(@"D:\WPF_Project\GsiImageView\Image\MaxImageTest");
            try
            {
                if (di.Exists)
                {
                    //경로가 있음
                    foreach (FileInfo fi in di.GetFiles())
                    {
                        //경로를 타고 세부 이미지 이름을 얻어 온다.
                        string path = di.FullName + "\\" + fi.Name;

                        this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.DataBind, new UpdateImage(UpdateImageList), path);

                        Thread.Sleep(60);
                    }
                }
                else
                {
                    MessageBox.Show("경로가 확실하지 않습니다.");
                    return;
                }
            }
            catch
            {
                MessageBox.Show("경로가 확실하지 않거나, 비정상 오류 입니다.");
                return;
            }
        }


몇개더 구현되어야할 내용입니다.
1. 경로 입력후 해당 경로에 맞는 이미지 찾아 오기
2. 경로 내부의 서브폴더까지 찾아서 이미지 추가 하는 방법 구현하기
3. ListBox의 그룹별 소트 방법 및 재정렬 방법 구현하기
4. 미리 목록을 얻어 와서 드로잉 하고 세부 이미지 부분만을 여러개의 스레드를 사용해서 구동되는 형태로 구현하기
5. 미정...


<해당 데모>


Posted by gsi
:

WPF를 공부 하면서 무언가 만들어 보는 목적이 없다면 공부에 쉽게 지치게 되고 시간을 허비 하게 되는거 같다.
그래서 시작 하였다. "WPF 프로젝!!" 폴더 안의 카테고리는 데모를 제작해 보면서 공부를 하고 데모를 배포 하며, 다른 사람으로 하여금 사용될 수 있는 것을 목표로 한다.

저작권은 본 IamGsi 플로그에 있으며, 배포 또는 사용하는데 있어서 제약이 없습니다.
수정사항이 있거나 아이디어가 있으신 분은 피드백을 해주시면 감사하겠습니다.
단, 상업적인 목적으로 할때는 연락을 주시면 감사하겠습니다.

[프로그램 소개]
본 프로그램은 해당 폴더에 있는 이미지를 화면에 보여 주는 형식입니다.

Posted by gsi
: