我正在为 Windows Embedded 项目开发 Silverlight。我定义了一个由图像控件组成的自定义用户控件。我想在 xaml 中为自定义控件的不同实例指定不同的图像源。所以我在自定义控件中定义了一个依赖属性“MyImage”。
在 Blend C# 代码隐藏中: public UserControl1() { InitializeComponent(); ItemImage.DataContext = 这个;}
public ImageSource MyImage
{
get { return (ImageSource)GetValue(MyImageProperty); }
set { SetValue(MyImageProperty, value); }
}
public static readonly DependencyProperty MyImageProperty =
DependencyProperty.Register("MyImage", typeof(ImageSource), typeof(UserControl1), null);
在 UserControl.xaml 中,我将图像控件 Source 属性绑定到 MyImage:
<Image x:Name="ItemImage" Margin="0,0,90,0" Source="{Binding MyImage}"/>
因此,当我使用自定义控件时,我可以在 xaml 中执行此操作:
<local:UserControl1 HorizontalAlignment="Left" Margin="94,117,0,0" Width="196" Height="85" VerticalAlignment="Top" MyImage="img1.png"/>
<local:UserControl1 HorizontalAlignment="Left" Margin="94,217,0,0" Width="196" Height="85" VerticalAlignment="Top" MyImage="img2.png"/>
在 Blend 中测试是可以的。我可以看到两个自定义控件实例中显示的两个图像。
然后来到 SWE C++ 代码隐藏,我在 UserControl1.cpp 中重新定义并注册了依赖属性:
XRDependencyPropertyMetaData dpmImage = XRDependencyPropertyMetaData();
dpmImage.Size = sizeof(IXRImageSource);
dpmImage.pfnPropertyChangeNotification = ImagePropertyChanged;
dpmImage.pfnTypeConverter = ConvertNameTypeConverter;
dpmImage.pfnEnumerableCreation = NULL;
XRValue defImage;
defImage.vType = VTYPE_OBJECT;
defImage.pObjectVal = NULL;
dpmImage.DefaultValue = defImage;
hr = pApplication->RegisterDependencyProperty(L"MyImage", VTYPE_OBJECT, ControlID(), &dpmImage, &m_dpMyImageID);
void UserControl1::ImagePropertyChanged( __in IXRDependencyObject* pControl, __in XRValue* pOldValue, __in XRValue* pNewValue )
{......}
HRESULT UserControl1::ConvertNameTypeConverter( XRValue *pValIn, XRValue *pValOut )
{......}
编译执行成功,只是我没有看到两个控件中显示图片。
调试时,我可以看到首先调用了 ConvertNameTypeConverter 回调。我可以看到图像文件名作为字符串存储在 pValIn 中,这与 MSDN 文档描述的内容一致:当 XAML for Windows Embedded 在解析阶段调用此函数时,pValIn 将始终是一个字符串。
接下来调用 ImagePropertyChanged 回调,我可以看到 pNewValue 包含我在 ConvertNameTypeConverter() 中设置为 pValOut 的值。
我的问题是,我的做法是否正确?如果我只能获取图像文件名的字符串,如何从字符串中获取图像二进制文件?
有没有办法将图像二进制文件从 xaml 直接传输到 C++ 代码隐藏并直接显示?
谢谢!