2009-06-08 4 views
0

나는 listbox에서 이미지를로드하는 wpf 응용 프로그램을 개발했습니다. 300mb 이미지를로드하는 데 시간이 걸립니다. 나는 listv에서 observablecollection을 사용하여 이미지를 더 빠르게로드한다고 들었습니다. ,하지만 난 그걸 사용하는 방법을 몰라. 제안 사항 plz .. 미리 감사드립니다.observablecollection 클래스를 만들어 WPF 응용 프로그램에서 이미지를로드하는 방법

답변

2

ObservableCollection은 List와 똑같이 사용할 수 있습니다. 하지만 이미지를 더 빨리로드하는 데 도움이되지 않습니다 ...

이미지를 포함하는 ObservableCollection에 ListBox를 바인딩하고 이미지를 별도의 스레드로 채 웁니다. 일반적으로 다른 스레드에서 바운드 컬렉션을 수정할 수는 없지만이 문제를 처리 할 수있는 AsyncObservableCollection 클래스를 작성했습니다.

1

이미지를 ObservableCollection으로 이동해도 마술처럼 빠르게 로딩되지는 않습니다. 오래 걸릴 가능성이있는 것은 디스크에서 이미지 데이터를로드하는 것입니다. 이미지 데이터를로드하는 동안 주 UI 스레드가 멈추지 않도록이 메시지를 백그라운드 스레드로 옮겨야합니다. BackgroundWorker 또는 Dispatcher을 사용하여 모든 스레딩 코드를 직접 작성하지 않아도됩니다.

+0

나는 backgroundworker로 시도했지만 여전히 느립니다. – ibrahimkhan

+0

느린 부분은 무엇입니까? 문제가 무엇인지 파악하는 데 도움이 필요하면 더 많은 정보를 제공해야합니다. BackgroundWorker가 끝날 때까지 주 스레드가 대기 중이면 UI는 계속 중단됩니다. – Andy

2

컬렉션의 항목을 추가/제거/바꾸고 해당 변경 사항으로 UI가 자동으로 업데이트 될 것으로 예상 할 경우 ObservableCollection 만 필요합니다. 즉 ObservableCollection은 Thomas 또는 Andy가 백그라운드 스레드에서로드하는 것에 대한 제안에 완벽 할 것입니다.

제한이 있지만 언급할만한 또 다른 가능성이 있습니다. ListBox는 현재보기로 스크롤되는 목록 항목에 대해서만 UI 요소를 만듭니다. 한 번에 적은 수의 이미지 만 목록 상자에 표시되고 다른 이미지는 모두 보이지 않게 스크롤되면이 기능을 활용하고 ListBox에 이미지를 게으른로드 할 수 있습니다.

이렇게하려면 실제 이미지 객체를 ListBox에 넣지 않을 것입니다. 대신 필요할 때 이미지를로드 할 수있는 것을 넣을 것입니다. 디스크 또는 웹에서 이미지를로드하는 경우 목록에 Uris가 포함될 수 있습니다. 웹 서비스에서로드하는 것과 같은 멋진 작업을 수행하는 경우 목록에 이미지를 지연로드하는 Image 속성이있는 클래스의 인스턴스가 포함될 수 있습니다.

그런 다음 컬렉션 (ObservableCollection이 아닌 목록)을 ListBox에 바인딩하고 ItemTemplate을 적절한 UI를 구성하고 Uri 또는 지연로드 Image 속성에 바인딩하는 DataTemplate으로 설정합니다.

위쪽 : 단순함. 스레딩 코드를 작성할 필요가 없습니다.

다운 사이드 : 데이터 양에 따라 다르지만 스크롤을 시작하기 전까지 나중의 이미지가로드되지 않으므로 스크롤 속도가 느려질 수 있습니다. 또한, 제가 언급했듯이 ListBox에 이미지가 처음 표시 될 때 대부분의 이미지가 맞으면이 이미지가 많이 표시되지 않으므로 스레딩이 더 좋은 답변이됩니다. 그리고 Uri는 일단 스크롤을하면 ListBox는 첫 번째 항목에 대해로드 한 이미지를 버리므로 스크롤 업 백업은 스크롤 다운만큼 느려집니다 (맞춤 클래스는 lazy-loading 속성은 이것을 수정합니다).

관련 문제