2017-02-21 9 views
0

누구나 WPF에서 비동기식으로 BitmapFrame을 만드는 방법을 알고 있습니까?비동기 메서드에서 비동기 적으로 BitmapFrame 만들기

Source 속성이 설정된 코드가있는 XAML Image 요소를 일괄 인쇄하고 싶습니다. 여기 LogoImageUrl은 비동기 적으로로드하려는 웹 이미지의 URL입니다.

public async Task<BitmapFrame> GetBitmapFrame(Uri uri) 
{ 
    await ... // What to be awaited? 

    return BitmapFrame.Create(uri); 
} 

가 ... 그래서 나는 try 블록에이 방법을 사용하고 finally 블록에 인쇄 할 수 있습니다 :

LogoImage.Source = BitmapFrame.Create(new Uri(LogoImageUrl)); 

나는이 같은 async 방법을 만들 수 있습니까?

+1

넌 여기서 IsAsync (https://msdn.microsoft.com/en-us/library/system.windows.data.binding.isasync (V = vs.110) .ASPX) 속성을 사용하여 그것을 달성하기위한 바인딩. – Sinatr

+0

로컬 또는 원격 (웹) 이미지 파일을로드합니까? – Clemens

+0

@Clemens 웹 이미지를로드하고 싶습니다. –

답변

1

당신은 비동기 적으로 다운로드 버퍼에서 BitmapFrame을 웹 이미지를 다운로드하여 작성해야합니다 : 위의 예에서 BitmapFrame.Create 호출이 냉동 BitmapFrame을 반환하기 때문에

public async Task<BitmapFrame> GetBitmapFrame(Uri uri) 
{ 
    var httpClient = new System.Net.Http.HttpClient(); 
    var buffer = await httpClient.GetByteArrayAsync(uri); 

    using (var stream = new MemoryStream(buffer)) 
    { 
     return BitmapFrame.Create(
      stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
    } 
} 

, 당신은 또한 BitmapFrame을 비동기 적으로 만들 수 있습니다 (나는 그것이 필요하다고 생각하지만).

public async Task<BitmapFrame> GetBitmapFrame(Uri uri) 
{ 
    var httpClient = new System.Net.Http.HttpClient(); 
    var buffer = await httpClient.GetByteArrayAsync(uri); 

    return await Task.Run(() => 
    { 
     using (var stream = new MemoryStream(buffer)) 
     { 
      return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
     } 
    }); 
} 
+0

Duh, 어떻게 HttpClient를 생각할 수 없습니까 ... 감사합니다. 작동합니다! –