これを行うには2つの方法がありました。どちらの方法でも、画像をラップして実装するクラスを使用しますINotifyPropertyChanged
。
class ImageSourceWrapper : ObservableObject
{
private ImageSource _image;
public ImageSource Image
{
get { return _image; }
set
{
if (value != _image)
{
_image = value;
RaiseOnPropertyChanged("Image");
}
}
}
public ImageSourceWrapper(ImageSource image)
{
Image = image;
}
}
最初のアプローチ
これを取得したら、次のように、マークアップ拡張機能でImageSourceWrapper
オブジェクトを返してバインドすることができます。
<Image Source="{Binding Source={my:ImageProvider ImageName=myImageName}, Path=Image}" />
私はこの方法があまり好きではありませんでした。かなり面倒で、ImageSourceWrapper
単純に を操作するのではなく、クラスを知らなければならないからImageSource
です。それから私は2番目のアプローチを思いつきました。
第二のアプローチ
このアプローチでもImageSourceWrapper
クラスを使用しますが、マークアップ拡張機能にImageSourceWrapper
オブジェクトを返す代わりに、オブジェクトにバインドするように設定したバインディング オブジェクトを返しImageSourceWrapper
ます。
マークアップ拡張機能は次のようになります。
private ImageSourceWrapper _imageSourceWrapper;
public override object ProvideValue(IServiceProvider serviceProvider)
{
// Get the object and the property to be bound.
IProvideValueTarget service = IProvideValueTarget)provider.GetService(typeof(IProvideValueTarget));
DependencyObject targetObject = service.TargetObject as DependencyObject;
DependencyProperty targetProperty = service.TargetProperty as DependencyProperty;
// Set up the binding with the default image.
_imageSourceWrapper = new ImageSourceWrapper(DefaultImage);
Binding binding = new Binding("Image");
binding.Source = _imageSourceWrapper;
BindingOperations.SetBinding(targetObject, targetProperty, binding);
// Retrieve the actual image asynchronously.
GetImageAsync();
return binding.ProvideValue(serviceProvider);
}
private void GetImageAsync()
{
// Get the image asynchronously.
// Freeze the image so it could be accessed from all threads regardless
// of which thread it was created on.
newImage.Freeze();
// Got the image - update the _imageSourceWrapper object.
_imageSourceWrapper = newImage;
}
次に、このように XAML で使用できます
<Image Source="{my:ImageProvider ImageName=myImageName}" />
このようにして、デフォルトの画像が最初に表示され、要求された画像が取得されると、代わりに表示されます。
ここのコードが完全に正しくない場合は申し訳ありませんが、現時点ではコードに近づいていません。願わくば、現時点では主なアイデアを表現するにはこれで十分です。