使用 XAML 中的转换器通过绑定动态设置 BitmapImage

Set BitmapImage dynamically via Binding using a converter in XAML

我有以下 xaml(请注意,这在 Microsoft Workflow Foundation activity 中使用并包含在 <sap:ActivityDesigner.Icon> 中。希望这不会有影响,但我认为我会提到它。)

<DrawingBrush>
    <DrawingBrush.Drawing>
        <ImageDrawing>
            <ImageDrawing.Rect>
                <Rect Location="0,0" Size="16,16" ></Rect>
            </ImageDrawing.Rect>
            <ImageDrawing.ImageSource>
                <BitmapImage UriSource="MyImage.png"/>
            </ImageDrawing.ImageSource>
        </ImageDrawing>
    </DrawingBrush.Drawing>
</DrawingBrush>

我需要在 运行 时更改 UriSource,所以我想我应该使用这样的转换器:

<DrawingBrush>
    <DrawingBrush.Drawing>
        <ImageDrawing>
            <ImageDrawing.Rect>
                <Rect Location="0,0" Size="16,16" ></Rect>
            </ImageDrawing.Rect>
            <ImageDrawing.ImageSource>
                <BitmapImage UriSource="{Binding Path=MyObject, Converter={StaticResource NameToImageConverter}}"/>
            </ImageDrawing.ImageSource>
        </ImageDrawing>
    </DrawingBrush.Drawing>
</DrawingBrush>

但是如果尝试将它绑定到我的对象并使用转换器,我会收到以下错误:

提供的 DependencyObject 不是此 Freezable 的上下文

请注意,它不会影响我的转换器。

我找到了 ,我认为这会有所帮助,但无济于事。

为 BitmapImage 对象设置名称时

<BitmapImage Name="MyBitmapImage"/>

我以为我可以通过代码设置它,但我仍然遇到同样的错误。

我不知道自从最初查看此内容以来我做了什么,但最初我收到一条错误消息,提示我应该使用 beginInit 和 endInit。抱歉没有确切的错误,因为我无法复制它。

关于如何实现这一点有什么想法吗?

谢谢。

BitmapImage实现了ISupportInitialize接口,只能初始化一次,以后不能更改。如果您的 MyObject 应该在运行时更改其值并通知 UI,那将不起作用。

您可以将绑定更改为

<ImageDrawing
    ImageSource="{Path=MyObject, Converter={StaticResource NameToImageConverter}}"
    Rect="0,0,16,16" />

并使绑定转换器 return 成为 BitmapImage 而不是 Uri:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    ...
    string uri = ...;
    return new BitmapImage(new Uri(uri));
}