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

Set BitmapImage dynamically via Binding using a converter in XAML

提问人:Thierry 提问时间:6/19/2020 更新时间:6/19/2020 访问量:170

问:

我有以下内容(请注意,这在 Microsoft 工作流基础活动中使用,并且包含在 .希望这无关紧要,但我想我会提到它。xaml<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 的上下文

请注意,它不会击中我的转换器。

我发现提供的 DependencyObject 不是这个 Freezable WPF c# 的上下文,我认为这会有所帮助,但无济于事。

为 BitmapImage 对象设置名称时

<BitmapImage Name="MyBitmapImage"/>

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

我不知道自从最初看到这个以来我做了什么,但最初我遇到了一个错误,说我应该使用 beginInit 和 endInit。对不起,没有确切的错误,因为我无法复制它。

关于如何实现这一目标的任何想法?

谢谢。

WPF XAML 绑定 工作流-Foundation-4

评论

0赞 Clemens 6/19/2020
使用返回 ImageSource 而不是 Uri 的转换器怎么样?<ImageDrawing ImageSource="{Binding ...}"/>
0赞 Clemens 6/19/2020
如果 MyObject 应该在运行时更改其值并通知 UI,则您的方法无论如何都不起作用,因为 BitmapImage 只能由其 UriSource 属性初始化一次。以后无法更改。
0赞 Thierry 6/19/2020
@Clemens 非常感谢您的建议!你能把它作为一个答案吗?它在 ImageDrawing 上设置 ImageSource 效果很好,我不得不对如何加载图像进行更多的挖掘,但它现在与转换器配合得很好。

答:

1赞 Clemens 6/19/2020 #1

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

您可以将绑定更改为

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

并使绑定转换器返回 BitmapImage 而不是 Uri:

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