Wpf 使用XAML中的转换器通过绑定动态设置BitmapImage 我有下面的 XAML(注意这是在微软工作流基础活动中使用的,包含在 中。希望,没关系,但我想我已经提过了。)

Wpf 使用XAML中的转换器通过绑定动态设置BitmapImage 我有下面的 XAML(注意这是在微软工作流基础活动中使用的,包含在 中。希望,没关系,但我想我已经提过了。),wpf,xaml,binding,workflow-foundation-4,Wpf,Xaml,Binding,Workflow Foundation 4,我需要在运行时更改URI源,因此我认为应该使用这样的转换器: <DrawingBrush> <DrawingBrush.Drawing> <ImageDrawing> <ImageDrawing.Rect> <Rect Location="0,0" Size="16,16" ></Rect> </ImageDrawi

我需要在运行时更改URI源,因此我认为应该使用这样的转换器:

<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的东西。抱歉,没有确切的错误,因为我无法复制它

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


谢谢。

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

您可以将绑定更改为

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

使用返回ImageSource而不是Uri的转换器如何?如果您的MyObject应该在运行时更改其值并通知UI,您的方法无论如何都不会起作用,因为BitmapImage只能通过其UriSource属性初始化一次。以后不能更改了。@Clemens非常感谢您的建议!你能坚持这个回答吗。在ImageDrawing上设置ImageSource效果很好。我不得不对如何加载图像做更多的挖掘,但现在它与转换器一起工作很好。
<ImageDrawing
    ImageSource="{Path=MyObject, Converter={StaticResource NameToImageConverter}}"
    Rect="0,0,16,16" />
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    ...
    string uri = ...;
    return new BitmapImage(new Uri(uri));
}