以下xaml在Window
:
<Border Width="45" Height="55" CornerRadius="10" >
<Border.Background>
<ImageBrush>
<ImageBrush.ImageSource>
<CroppedBitmap Source="profile.jpg" SourceRect="0 0 45 55"/>
</ImageBrush.ImageSource>
</ImageBrush>
</Border.Background>
</Border>
但是当我在DataTemplate
中使用等效代码时,我在运行时遇到以下错误:
对象初始化失败 (ISupportInitialize.EndInit)。 '源' 属性未设置。对象出错 'System.Windows.Media.Imaging.CroppedBitmap' 标记文件中的。
内在例外: {“'来源'属性未设置。”}
唯一的区别是我有CroppedBitmap
的Source属性数据绑定:
<CroppedBitmap Source="{Binding Photo}" SourceRect="0 0 45 55"/>
是什么给出了?
更新:根据old post by Bea Stollnitz,这是CroppedBitmap
的源属性的限制,因为它实现了ISupportInitialize
。 (此信息在页面下方 - 在“11:29”进行搜索,你会看到)
这仍然是.Net 3.5 SP1的问题吗?
答案 0 :(得分:3)
当XAML解析器创建CroppedBitmap时,它执行相当于:
var c = new CroppedBitmap();
c.BeginInit();
c.Source = ... OR c.SetBinding(...
c.SourceRect = ...
c.EndInit();
EndInit()
要求Source
为非空。
当您说c.Source=...
时,该值始终在EndInit()之前设置,但如果您使用c.SetBinding(...)
,它会尝试立即执行绑定但检测到DataContext
没有尚未定。因此,它将绑定推迟到以后。因此,当调用EndInit()
时,Source
仍然为空。
这解释了为什么在这种情况下需要转换器。
答案 1 :(得分:0)
我以为我会通过提供alluded-to Converter来完成the other answer。
现在我使用这个转换器似乎工作,没有更多Source'属性没有设置错误。
public class CroppedBitmapConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
FormatConvertedBitmap fcb = new FormatConvertedBitmap();
fcb.BeginInit();
fcb.Source = new BitmapImage(new Uri((string)value));
fcb.EndInit();
return fcb;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}