그물에서 사진을 가져 와서 순차적으로 표시합니다
-
11-07-2019 - |
문제
인터넷에서 가져온 스크롤 가능한 사진 목록을 만들고 사용자에게 클릭 할 수있는 기능을 제공하고 싶습니다. WinForms/C#에서 어떻게해야합니까? ListBox에 PictureBox Control/ Control을 추가 할 수 있습니까?
AutoScroll이 True로 설정된 UserControl에 PictureBox 목록을 추가하려고 시도했습니다. Listbox를 사용하는 느낌이들 것입니다. 올바른 접근 방식입니까?
또한 PictureBox의 ImageLocation을 이미지의 URI로 설정 한 다음 Load () 호출하여 이미지를로드하면 작동했지만 내 양식이 얼어 붙었습니다! 내 양식을 얼지 않고 순차적으로 각 그림 박스를 어떻게 업데이트하려고합니까?
감사합니다, Azlam
해결책
나는 당신의 세 번째 질문에 먼저 대답 할 것입니다. 사진 상자에는 지체가 나오는 스레드에 이미지를로드하고 앱을 걸지 않는 LoadAsync () 메소드가 있습니다.
다른 질문에 관해서는, 나도 사용자 컨트롤로 시작하여 이미지를 거기에 넣을 것입니다. 내가 제안 할 수있는 유일한 것은 먼저 사진 상자가있는 사용자 컨트롤과 그 옆에 멀티 라인 텍스트 상자 또는 RichTextBox가있는 사용자 컨트롤을 만드는 것입니다. 텍스트 상자의 테두리를 끄고 전체 컨트롤 주위에 약간의 테두리가 있습니다. 이렇게하면 이미지 옆에 텍스트가 표시되어 이미지를 표시 할 수 있습니다. 그런 다음 실제 최종 컨트롤은 필요에 따라 추가 할 수있는 기능을 갖춘 이러한 컨트롤의 모음 일뿐입니다.
-My 2 센트 ...
다른 팁
수직으로 스크롤하는 것이 신경 쓰나요?
DataGridView Control부터 기본으로 시작하여 다음 구현을 작성합니다.
1) DataGridViewImageColumn에서 파생 된 사용자 정의 열 및 CellType를 만듭니다. "cronosnetimagecolumn", "cronosnetimagecell"이라고 부를 수 있습니다.
2) 셀 데이터를 보유하기 위해 "cronosimagedEtails"클래스를 만듭니다 (디스플레이 텍스트 및 이미지 URL에 대한 속성 포함). 이것은 각 셀의 값으로 전달됩니다. 전:
imageGrid.rows.add (new cronoSimageDetails {displayText = "해변의 날", imageUrl = "http : //...beach.jpg"});
3) 셀 페인트 ()을 무시하여 웹 클리어를 사용하여 이미지를 가져 와서 e.graphics.drawimage (imageObtainedfromwebclient)를 사용하여 이미지를 셀에 페인트합니다. e.graphics.drawstring ((cronosimagedEtails) value.displayText, ...)를 사용하여 셀의 텍스트를 오버레이 할 수 있습니다.
이 빠른 솔루션을 사용하면 사용자가 목록을 스크롤 할 때 이미지 만로드하고 개선을위한 견고한 기반을 제공하는 스크롤 ImageList가 제공됩니다.
추가 최적화 권장 :
a) 셀 데이터를 그리기위한 백 버퍼 비트 맵 및 그래픽을 만듭니다.
b) 이미지를 얻기 위해 작업을 수행하는 대신 백 버퍼를 페인트하는 페인트 설정 ()
c) 이미지를 다운로드하고 뒷 버퍼에 페인트하는 새 스레드를 스폰하는 새 셀 메소드 LoadImage ()를 만듭니다.
d) Paint (또는 별도의 도우미 스레드)가 스크롤의 방향과 가속을 추적하고 어떤 셀이 사전로드되어야하는지 추정하는 방향을 추적하십시오. 해당 셀에서로드 이디 지 ()를 트리거합니다.
e) 로딩 이미지로 각 셀의 후면 버퍼를 초기화합니다.
f) 이미지 로딩 시간의 경험적 데이터를 추적하고 사용하여 어떤 셀을 사전로드 해야하는지 결정합니다.