2017-12-01 4 views
0

목록 뷰에 원격 이미지를로드하려고하는데 마지막 이미지 만 목록에 표시되고 나머지는 표시되지 않습니다. 다음은 코드입니다. 맨 위에있는 코드의 일부를 제거했습니다. 코드는 ok로 컴파일됩니다. 리모트 이미지가로드되지 않는다는 것입니다 (UI의 마지막 이미지는 제외). 어떤 도움도 멋질 것입니다!WPF 목록 뷰에 원격 이미지를 추가하려고 시도했지만 마지막 뷰에만 표시됩니다.

public async void button_Click(object sender, RoutedEventArgs e) 
    { 
     if (youtube_ids.Count > 0) 
     { 
      DownloadLinks.Visibility = Visibility.Visible; 
      foreach (var youtube_id in youtube_ids) 
      { 

       var grid = new Grid(); 
       grid.Width = 400; 
       grid.Height = 50; 



       // image thumbnail 
       var thumb = new Image(); 

       thumb.Width = 50; 
       thumb.MaxHeight = 50; 
       thumb.Margin = new System.Windows.Thickness { Left = 10 }; 


       var thumb_file = new BitmapImage(new Uri($"http://img.youtube.com/vi/{youtube_id}/0.jpg", UriKind.Absolute)); 
       thumb.VerticalAlignment = System.Windows.VerticalAlignment.Center; 
       thumb.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; 
       thumb_file.DownloadCompleted += (ob, ev) => 
       { 
        thumb.Source = thumb_file; 



       }; 
       grid.Children.Add(thumb); 
       DownloadLinks.Items.Add(grid); 

      } 
     } 
    } 

미리보기 이미지 옆에 추가하는 버튼이 있습니다. 여기에 그 모습을 보여주는 스크린 샷이 있습니다. screenshot

+1

는 엄지 손가락을 만드는 코드를 가지고 루프에 넣어, 그래서 당신은 대신 한 시간이 여러 번 일을 할 것입니다. –

+0

@Clemens 실제로 코드의 일부만 게시 했으므로 코드를 업데이트하고 마지막으로 DownloadLinks라는 목록 뷰에 표를 추가했습니다. 단추 (여기에 표시되지 않음)를 추가하면 이미지가 있어야 할 위치 옆에 바로 나타납니다. 여기 보이는 모양입니다. https://i.imgur.com/3Fdzafx.jpg –

+0

@EdPlunkett ah 죄송합니다. 실수로 붙여 넣기 실수로, 실제로 모든 코드가 루프 안에 있습니다. –

답변

1

, 적절한 ItemTemplate을

<ListView x:Name="images"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <Image Width="50" MaxHeight="50" Margin="10" Source="{Binding}"/> 
     </DataTemplate> 
    </ListView.ItemTemplate> 
</ListView> 

을 선언하고 ItemsSource 속성에 이미지 URL 문자열의 집합을 할당합니다

images.ItemsSource = youtube_ids.Select(
    i => string.Format("http://img.youtube.com/vi/{0}/0.jpg", i)); 
+0

당신의 대답이 올바른 방향으로 나를 지적 해 주었기 때문에'를''안에 넣었습니다. –

1

위의 코드를 기반으로 엄지 손톱을 다운로드하지 않는 이유가 여기에 있습니다. 또한 다운로드가 완료되면 이벤트 외부의 변수에 의존하는 대신 이벤트 변수를 사용해보십시오. 다시 할당하면 문제가 발생할 수 있습니다.

루프와 그리드 외부에서 다운로드를 이동하십시오. 대신에 뒤에 코드에서 UI 요소를 만드는

+0

은 복사 붙여 넣기 오류임을 깨닫고 문제의 코드를 수정했습니다. –

0

문제는이 모양이다 이 메서드의 범위를 벗어나는 "grid"라는 클래스 멤버가 있습니다. 위에서 언급 한 netniV는 바로 이러한 이유로해서는 안됩니다.

이전에 이미 추가 한 동일한 눈금을 다시 추가하기 만하면됩니다.

코드는 다음과 같아야합니다

public async void button_Click(object sender, RoutedEventArgs e) 
{ 
    if (youtube_ids.Count > 0) 
    { 
     DownloadLinks.Visibility = Visibility.Visible; 
     foreach (var youtube_id in youtube_ids) 
     { 

       var grid = new Grid(); 
       grid.Width = 400; 
       grid.Height = 50; 



      // image thumbnail 
      var thumb = new Image(); 

      thumb.Width = 50; 
      thumb.MaxHeight = 50; 
      thumb.Margin = new System.Windows.Thickness { Left = 10 }; 


      var thumb_file = new BitmapImage(new Uri($"http://img.youtube.com/vi/{youtube_id}/0.jpg", UriKind.Absolute)); 
      thumb.VerticalAlignment = System.Windows.VerticalAlignment.Center; 
      thumb.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; 
      thumb_file.DownloadCompleted += (ob, ev) => 
      { 
       thumb.Source = thumb_file; 



      }; 
      grid.Children.Add(thumb); 
      DownloadLinks.Items.Add(grid); 
     **}** 
    } 
} 
+0

사실 DownloadLinks는 XAML에서 작성된 목록보기입니다. 그리드 아이템을 동적으로 추가하려고합니다. 나는 그것이 문제가 아니라고 생각한다. –

+0

또한 참조 된 변수와 안전을 위해 이벤트 변수를 사용하는지 여부도 궁금합니다. – netniV

+0

저는 이것이 문제라는 것을 확신합니다. for 루프가 DownloadLinks에 새 그리드를 추가하지 않습니다. 폐지 된 foreach가 잘못된 위치에 있기 때문에 새로운 그리드를 X 개 생성하고 축소판을 1 개 추가하는 것보다 ... 위에서 설명한 것을 시도했습니다. – Slacker