WPF - 在DataTemplate中使用CroppedBitmap

时间:2009-11-10 21:01:58

标签: wpf data-binding datatemplate crop bitmapimage

以下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的问题吗?

2 个答案:

答案 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();
    }
}