이미지 UriSource 및 데이터 바인딩
다음과 같이 사용자 지정 개체 목록을 WPF 이미지에 바인딩하려고합니다.
<Image>
<Image.Source>
<BitmapImage UriSource="{Binding Path=ImagePath}" />
</Image.Source>
</Image>
하지만 작동하지 않습니다. 이것은 내가 얻는 오류입니다.
"속성 'UriSource'또는 속성 'StreamSource'를 설정해야합니다."
내가 무엇을 놓치고 있습니까?
WPF에는 특정 유형에 대한 기본 제공 변환기가 있습니다. Image의 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의 Source 속성에 대한 일반 리소스 이미지 바인딩
- 리소스 이미지를 바인딩하지만 코드 뒤에서
- Application.GetResourceStream을 사용하여 코드 뒤에 리소스 이미지 바인딩
- 메모리 스트림을 통해 파일 경로에서 이미지로드 (데이터베이스에서 블로그 이미지 데이터를로드 할 때도 동일 함)
- 파일 경로에서 이미지를로드하지만 파일 경로 속성에 대한 바인딩을 사용하여
- 종속성 속성을 통해 내부적으로 이미지 컨트롤이있는 사용자 컨트롤에 이미지 데이터 바인딩
- 포인트 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;
}
}
값 변환기보다 조금 더 작업이 될 수 있다고 생각하지만 또 다른 옵션입니다.
You need to have an implementation of IValueConverter interface that converts the uri into an image. Your Convert implementation of IValueConverter will look something like this:
BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(value as string);
image.EndInit();
return image;
Then you will need to use the converter in your binding:
<Image>
<Image.Source>
<BitmapImage UriSource="{Binding Path=ImagePath, Converter=...}" />
</Image.Source>
</Image>
The problem with the answer that was chosen here is that when navigating back and forth, the converter will get triggered every time the page is shown.
This causes new file handles to be created continuously and will block any attempt to delete the file because it is still in use. This can be verified by using Process Explorer.
If the image file might be deleted at some point, a converter such as this might be used: using XAML to bind to a System.Drawing.Image into a System.Windows.Image control
The disadvantage with this memory stream method is that the image(s) get loaded and decoded every time and no caching can take place: "To prevent images from being decoded more than once, assign the Image.Source property from an Uri rather than using memory streams" Source: "Performance tips for Windows Store apps using XAML"
To solve the performance issue, the repository pattern can be used to provide a caching layer. The caching could take place in memory, which may cause memory issues, or as thumbnail files that reside in a temp folder that can be cleared when the app exits.
you may use
ImageSourceConverter class
to get what you want
img1.Source = (ImageSource)new ImageSourceConverter().ConvertFromString("/Assets/check.png");
참고URL : https://stackoverflow.com/questions/20586/image-urisource-and-data-binding
'programing tip' 카테고리의 다른 글
Ctrl + R은 SSMS에서 쿼리 결과 창을 숨기지 않습니다. (0) | 2020.11.27 |
---|---|
주입 및 리소스 및 자동 연결 주석 (0) | 2020.11.27 |
Eclipse 서버 시작 시간 초과를 어떻게 비활성화 할 수 있습니까? (0) | 2020.11.27 |
읽기 전용 종속성 속성을 어떻게 생성합니까? (0) | 2020.11.27 |
"For"루프 첫 번째 반복 (0) | 2020.11.27 |