programing

이미지 URI 소스 및 데이터 바인딩

lastcode 2023. 5. 17. 23:13
반응형

이미지 URI 소스 및 데이터 바인딩

다음과 같이 사용자 지정 개체 목록을 WPF 이미지에 바인딩하려고 합니다.

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=ImagePath}" />
    </Image.Source>
</Image>

하지만 효과가 없습니다.다음과 같은 오류가 발생합니다.

"'UriSource' 속성 또는 'StreamSource' 속성을 설정해야 합니다."

제가 무엇을 빠뜨리고 있나요?

WPF에는 특정 유형에 대한 내장형 변환기가 있습니다.이미지를 바인딩하는 경우Source의 재산.string또는Uri후드 아래에서 WPF는 ImageSourceConverter를 사용하여 값을 다음으로 변환합니다.ImageSource.

그렇게

<Image Source="{Binding ImageSource}"/>

ImageSource 속성이 이미지에 대한 유효한 URI의 문자열 표현인 경우 작동합니다.

물론 바인딩 컨버터를 직접 굴릴 수 있습니다.

public class ImageConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new BitmapImage(new Uri(value.ToString()));
    }

    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

다음과 같이 사용합니다.

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

Atul Gupta의 이 기사에는 몇 가지 시나리오를 다루는 샘플 코드가 있습니다.

  1. XAML의 소스 속성에 대한 정기적인 리소스 이미지 바인딩
  2. 리소스 이미지를 바인딩하고 있지만 코드 뒤에 있는 경우
  3. 응용 프로그램을 사용하여 코드 뒤에 있는 리소스 이미지를 바인딩합니다.리소스 스트림 가져오기
  4. 메모리 스트림을 통해 파일 경로에서 이미지 로드(데이터베이스에서 블로그 이미지 데이터 로드 시 동일)
  5. 파일 경로에서 이미지를 로드하지만 파일 경로에 바인딩을 사용하여 속성
  6. 종속성 속성을 통해 내부적으로 이미지 제어를 수행하는 사용자 컨트롤에 이미지 데이터 바인딩
  7. 5번 지점과 동일하지만 파일이 하드 디스크에 잠기지 않도록 합니다.

하위 요소를 사용하지 않고 소스 특성을 설정할 수도 있습니다.이렇게 하려면 클래스에서 이미지를 비트맵 이미지로 반환해야 합니다.여기 제가 한 가지 방법의 예가 있습니다.

<Image Width="90" Height="90" 
       Source="{Binding Path=ImageSource}"
       Margin="0,0,0,5" />

그리고 클래스 속성은 간단히 이것입니다.

public object ImageSource {
    get {
        BitmapImage image = new BitmapImage();

        try {
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
            image.UriSource = new Uri( FullPath, UriKind.Absolute );
            image.EndInit();
        }
        catch{
            return DependencyProperty.UnsetValue;
        }

        return image;
    }
}

가치 변환기보다 조금 더 많은 작업일 수도 있지만, 다른 옵션입니다.

URI를 이미지로 변환하는 IVvalueConverter 인터페이스 구현이 필요합니다.IValueConverter의 Convert 구현은 다음과 같습니다.

BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(value as string);
image.EndInit();

return image;

그런 다음 바인딩에 컨버터를 사용해야 합니다.

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=ImagePath, Converter=...}" />
    </Image.Source>
</Image>

여기서 선택한 답변의 문제는 앞뒤로 탐색할 때 페이지가 표시될 때마다 컨버터가 트리거된다는 것입니다.

이렇게 하면 새 파일 핸들이 계속 생성되고 파일이 아직 사용 중이므로 삭제 시도가 차단됩니다.프로세스 탐색기를 사용하여 확인할 수 있습니다.

이미지 파일이 삭제될 수 있는 경우 XAML을 사용하여 시스템에 바인딩하는 변환기를 사용할 수 있습니다.그림 그리기.이미지를 시스템에 저장합니다.윈도우.이미지 컨트롤

이 메모리 스트림 방법의 단점은 이미지가 매번 로드 및 디코딩되고 캐시가 수행되지 않는다는 것입니다. "이미지가 두 번 이상 디코딩되지 않도록 하려면 이미지를 할당하십시오.메모리 스트림을 사용하는 대신 URI의 소스 속성" 출처: "XAML을 사용하는 Windows Store 앱에 대한 성능 팁"

성능 문제를 해결하기 위해 저장소 패턴을 사용하여 캐싱 계층을 제공할 수 있습니다.캐시가 메모리에서 발생하여 메모리 문제가 발생하거나 앱이 종료될 때 지울 수 있는 임시 폴더에 있는 축소 이미지 파일로 발생할 수 있습니다.

사용할 수 있습니다.

ImageSourceConverter 클래스

원하는 것을 얻기 위해

    img1.Source = (ImageSource)new ImageSourceConverter().ConvertFromString("/Assets/check.png");

언급URL : https://stackoverflow.com/questions/20586/image-urisource-and-data-binding

반응형