GSI

사용자 삽입 이미지

[작업 경위]

--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
: