이미지 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의 이 기사에는 몇 가지 시나리오를 다루는 샘플 코드가 있습니다.
- XAML의 소스 속성에 대한 정기적인 리소스 이미지 바인딩
- 리소스 이미지를 바인딩하고 있지만 코드 뒤에 있는 경우
- 응용 프로그램을 사용하여 코드 뒤에 있는 리소스 이미지를 바인딩합니다.리소스 스트림 가져오기
- 메모리 스트림을 통해 파일 경로에서 이미지 로드(데이터베이스에서 블로그 이미지 데이터 로드 시 동일)
- 파일 경로에서 이미지를 로드하지만 파일 경로에 바인딩을 사용하여 속성
- 종속성 속성을 통해 내부적으로 이미지 제어를 수행하는 사용자 컨트롤에 이미지 데이터 바인딩
- 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
'programing' 카테고리의 다른 글
파이썬 3 바이트 문자열 변수를 일반 문자열로 변환하려면 어떻게 해야 합니까? (0) | 2023.05.17 |
---|---|
iPad 및 iPhone용 스타일 입력 버튼 (0) | 2023.05.17 |
코드 실행 시간 측정 (0) | 2023.05.12 |
Web Configuration Manager와 Configuration Manager의 차이점은 무엇입니까? (0) | 2023.05.12 |
테이블 없이 하드코드된 값 선택 (0) | 2023.05.12 |