Step1 - Thread 적용(Invoke, delegate)
WPF 프로젝!!/GsiSee 2007. 9. 13. 19:11 |[작업 경위]
--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. 미정...
<해당 데모>