[c#] WinRT에서 File Exists Converter를 만드는 방법


Answers

핵심 문제는 동기 작업 ( Convert ) 내에서 async 작업을 수행해야한다는 것입니다. 이 작업을 수행하는 쉬운 방법은 없습니다. 가능한 경우 코드가 필요하지 않도록 구조화하십시오 (예 : "변환"의 결과 인 다른 속성에 대한 async 업데이트를 한 속성에서 시작하도록).

강제로 적용하려면 ConfigureAwait(false) 를 사용해야합니다.

public object Convert(object value, Type targetType, object parameter, string language)
{
  // Note that "Result" will wrap any errors in AggregateException, which is annoying.
  return IfFileExist((string)value, "localimage.png").Result;
}

public async Task<string> IfFileExist(string value, string filename)
{
  var folder = ApplicationData.Current.LocalFolder;
  var getFilesAsync = await folder.GetFilesAsync(CommonFileQuery.OrderByName)
      .AsTask().ConfigureAwait(false);

  var file = getFilesAsync.FirstOrDefault(x => x.Name == filename);
  if (file != null)
  {
    return "ms-appdata:///local/" + filename;
  }
  return (string)value;
}
Question

로컬 저장소에 이미지 소스가있는 경우 변환기로 확인하려고합니다. 외부 URL로 이동하지 않는 경우.

<Image Source="{Binding Image, Converter={StaticResource ImageCacheConverter}}"/>

이것은 지금까지 내 변환기입니다.

public object Convert(object value, Type targetType, object parameter, string language)
{
    return IfFileExist((string)value, "localimage.png");
}
public async Task<string> IfFileExist(string value, string filename)
{
    var folder = ApplicationData.Current.LocalFolder;
    var getFilesAsync = await folder.GetFilesAsync(CommonFileQuery.OrderByName);

    var file = getFilesAsync.FirstOrDefault(x => x.Name == filename);
    if (file != null)
    {
        return "ms-appdata:///local/" + filename;
    }
    return (string)value;
}

내가 직면하고있는 주요 문제는 IValueConverter 내부에 비동기가 있다는 것입니다. 하지만 이미지 소스를 변경하려면 IfFileExist를 반환해야합니다.

미리 감사드립니다.




Related