提问人:Thierry 提问时间:6/19/2020 更新时间:6/19/2020 访问量:170
使用 XAML 中的转换器通过绑定动态设置 BitmapImage
Set BitmapImage dynamically via Binding using a converter in XAML
问:
我有以下内容(请注意,这在 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。对不起,没有确切的错误,因为我无法复制它。
关于如何实现这一目标的任何想法?
谢谢。
答:
1赞
Clemens
6/19/2020
#1
BitmapImage 实现接口,只能初始化一次,以后不能更改。如果应该在运行时更改其值并通知 UI,则将不起作用。ISupportInitialize
MyObject
您可以将绑定更改为
<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));
}
评论
<ImageDrawing ImageSource="{Binding ...}"/>