WPF - 在 DataTemplate 中使用 CroppedBitmap

发布于 2024-08-10 22:55:32 字数 1169 浏览 8 评论 0原文

以下 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' 在标记文件中。
内部异常:
{“未设置'Source'属性。”}

唯一的区别是我对 CroppedBitmap 的 Source 属性进行了数据绑定:

<CroppedBitmap Source="{Binding Photo}" SourceRect="0 0 45 55"/>

什么给出了?

更新:根据Bea Stollnitz 的旧帖子这是 CroppedBitmap 的源属性的限制,因为它实现了 ISupportInitialize。 (此信息位于页面下方 - 搜索“11:29”,您就会看到)。
.Net 3.5 SP1 仍然存在这个问题吗?

The following xaml works ok inside a 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>

But when I use the equivalent code in a DataTemplate I get the following error in run-time:

Failed object initialization
(ISupportInitialize.EndInit). 'Source'
property is not set. Error at object
'System.Windows.Media.Imaging.CroppedBitmap'
in markup file.
Inner Exception:

{"'Source' property is not set."}

The only difference is that I have the CroppedBitmap's Source property data-bound:

<CroppedBitmap Source="{Binding Photo}" SourceRect="0 0 45 55"/>

What gives?

UPDATE: According to an old post by Bea Stollnitz this is a limitation of the source property of the CroppedBitmap, because it implements ISupportInitialize. (This information is down the page - do a search on "11:29" and you'll see).
Is this still an issue with .Net 3.5 SP1?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

归属感 2024-08-17 22:55:32

当 XAML 解析器创建 CroppedBitmap 时,它执行等效操作:

var c = new CroppedBitmap();
c.BeginInit();
c.Source = ...    OR   c.SetBinding(...
c.SourceRect = ...
c.EndInit();

EndInit() 要求 Source 为非 null。

当您说c.Source=...时,该值始终在EndInit()之前设置,但如果您使用c.SetBinding(...),它尝试立即进行绑定,但检测到 DataContext 尚未设置。因此它将绑定推迟到以后。因此,当调用 EndInit() 时,Source 仍然为 null。

这解释了为什么在这种情况下需要转换器。

When the XAML parser creates CroppedBitmap, it does the equivalent of:

var c = new CroppedBitmap();
c.BeginInit();
c.Source = ...    OR   c.SetBinding(...
c.SourceRect = ...
c.EndInit();

EndInit() requires Source to be non-null.

When you say c.Source=..., the value is always set before the EndInit(), but if you use c.SetBinding(...), it tries to do the binding immediately but detects that DataContext has not yet been set. Therefore it defers the binding until later. Thus when EndInit() is called, Source is still null.

This explains why you need a converter in this scenario.

小猫一只 2024-08-17 22:55:32

我想我可以通过提供提到的转换器来完成另一个答案

现在我使用这个转换器,似乎可以工作,不再出现 Source' property is not set 错误。

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

I thought I would complete the other answer by providing the alluded-to Converter.

Now I use this converter and that seems to work, no more Source' property is not set error.

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();
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文