나는 listbox에서 이미지를로드하는 wpf 응용 프로그램을 개발했습니다. 300mb 이미지를로드하는 데 시간이 걸립니다. 나는 listv에서 observablecollection을 사용하여 이미지를 더 빠르게로드한다고 들었습니다. ,하지만 난 그걸 사용하는 방법을 몰라. 제안 사항 plz .. 미리 감사드립니다.observablecollection 클래스를 만들어 WPF 응용 프로그램에서 이미지를로드하는 방법
답변
ObservableCollection은 List와 똑같이 사용할 수 있습니다. 하지만 이미지를 더 빨리로드하는 데 도움이되지 않습니다 ...
이미지를 포함하는 ObservableCollection에 ListBox를 바인딩하고 이미지를 별도의 스레드로 채 웁니다. 일반적으로 다른 스레드에서 바운드 컬렉션을 수정할 수는 없지만이 문제를 처리 할 수있는 AsyncObservableCollection 클래스를 작성했습니다.
이미지를 ObservableCollection
으로 이동해도 마술처럼 빠르게 로딩되지는 않습니다. 오래 걸릴 가능성이있는 것은 디스크에서 이미지 데이터를로드하는 것입니다. 이미지 데이터를로드하는 동안 주 UI 스레드가 멈추지 않도록이 메시지를 백그라운드 스레드로 옮겨야합니다. BackgroundWorker 또는 Dispatcher을 사용하여 모든 스레딩 코드를 직접 작성하지 않아도됩니다.
컬렉션의 항목을 추가/제거/바꾸고 해당 변경 사항으로 UI가 자동으로 업데이트 될 것으로 예상 할 경우 ObservableCollection 만 필요합니다. 즉 ObservableCollection은 Thomas 또는 Andy가 백그라운드 스레드에서로드하는 것에 대한 제안에 완벽 할 것입니다.
제한이 있지만 언급할만한 또 다른 가능성이 있습니다. ListBox는 현재보기로 스크롤되는 목록 항목에 대해서만 UI 요소를 만듭니다. 한 번에 적은 수의 이미지 만 목록 상자에 표시되고 다른 이미지는 모두 보이지 않게 스크롤되면이 기능을 활용하고 ListBox에 이미지를 게으른로드 할 수 있습니다.
이렇게하려면 실제 이미지 객체를 ListBox에 넣지 않을 것입니다. 대신 필요할 때 이미지를로드 할 수있는 것을 넣을 것입니다. 디스크 또는 웹에서 이미지를로드하는 경우 목록에 Uris가 포함될 수 있습니다. 웹 서비스에서로드하는 것과 같은 멋진 작업을 수행하는 경우 목록에 이미지를 지연로드하는 Image 속성이있는 클래스의 인스턴스가 포함될 수 있습니다.
그런 다음 컬렉션 (ObservableCollection이 아닌 목록)을 ListBox에 바인딩하고 ItemTemplate을 적절한 UI를 구성하고 Uri 또는 지연로드 Image 속성에 바인딩하는 DataTemplate으로 설정합니다.
위쪽 : 단순함. 스레딩 코드를 작성할 필요가 없습니다.
다운 사이드 : 데이터 양에 따라 다르지만 스크롤을 시작하기 전까지 나중의 이미지가로드되지 않으므로 스크롤 속도가 느려질 수 있습니다. 또한, 제가 언급했듯이 ListBox에 이미지가 처음 표시 될 때 대부분의 이미지가 맞으면이 이미지가 많이 표시되지 않으므로 스레딩이 더 좋은 답변이됩니다. 그리고 Uri는 일단 스크롤을하면 ListBox는 첫 번째 항목에 대해로드 한 이미지를 버리므로 스크롤 업 백업은 스크롤 다운만큼 느려집니다 (맞춤 클래스는 lazy-loading 속성은 이것을 수정합니다).
- 1. 웹 응용 프로그램에서 새 이미지를로드하는 방법
- 2. WPF LINQ 및 ObservableCollection
- 3. WPF ObservableCollection in xaml
- 4. WPF - ObservableCollection PropertyChanged 이벤트?
- 5. 응용 프로그램에서 클래스를 만드는 방법을 결정하는 방법 ..?
- 6. 이미지를로드하는 방법?
- 7. WPF 응용 프로그램에서 플래시를 재생하는 방법
- 8. wpf 응용 프로그램에서 BitmapDecoder 객체를 삭제하는 방법
- 9. WPF 프리즘 응용 프로그램에서 리본을 통합하는 방법
- 10. WPF 응용 프로그램에서 matlab 수치를 표시하는 방법
- 11. WPF 응용 프로그램에서 Windows 양식을 표시하는 방법
- 12. WPF 응용 프로그램에서 다양한보기의 상태를 달성하는 방법
- 13. WPF - 데이터 바인딩 ObservableCollection CollectionChanged 이벤트?
- 14. Java에서 큰 이미지를로드하는 방법
- 15. db4o activatablelist 대 wpf observablecollection
- 16. WPF ObservableCollection CollectionView.CurrentChanged가 실행되지 않음
- 17. WPF - WPF 응용 프로그램에서 xbap으로 전환
- 18. url에서 이미지를로드하는 방법
- 19. wpf 응용 프로그램에서 표 제공
- 20. WPF 응용 프로그램에서 silverlight 디버깅
- 21. WPF 응용 프로그램에서 GraphViz 사용
- 22. wpf 응용 프로그램에서 busyindicator를 표시합니다.
- 23. WPF 응용 프로그램에서 GDI + 사용
- 24. WPF 응용 프로그램에서 파일 업로드
- 25. WPF 응용 프로그램에서 상태 저장
- 26. WPF 응용 프로그램에서 WinForm 시작
- 27. 별도의 스레드에서 ObservableCollection 업데이트
- 28. PHP에서 이미지를로드하는 방법
- 29. 자바에서 웹에서 이미지를로드하는 방법
- 30. iPhone에 이미지를로드하는 방법
나는 backgroundworker로 시도했지만 여전히 느립니다. – ibrahimkhan
느린 부분은 무엇입니까? 문제가 무엇인지 파악하는 데 도움이 필요하면 더 많은 정보를 제공해야합니다. BackgroundWorker가 끝날 때까지 주 스레드가 대기 중이면 UI는 계속 중단됩니다. – Andy