使用 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));
}
我有以下 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));
}