在“XAML for Windows Embedded (Compact 2013)”项目中获取可靠的图像源 URI

Get robust source URIs for Images in “XAML for Windows Embedded (Compact 2013)” projects

我在“XAML for Windows Embedded (Compact 2013)”项目(也称为 "Silverlight for Windows Embedded")的一部分后面的 C++ 代码中切换图像,例如

我将数字用作生成文件 PROJECTNAMEGenerated.rc2 中列出的 URI。它看起来像这样:

IDR_PROJ_APP             SLWE_XAML DISCARDABLE "XamlPack\App.Compressed"
IDR_PROJ_DISCLAIMERPAGE  SLWE_XAML DISCARDABLE "XamlPack\DisclaimerPage.Compressed"
IDR_PROJ_EASTEREGGPAGE   SLWE_XAML DISCARDABLE "XamlPack\EasterEggPage.Compressed"
IDR_PROJ_MAINPAGE        SLWE_XAML DISCARDABLE "XamlPack\MainPage.Compressed"
IDR_PROJ_MEASUREMENTPAGE SLWE_XAML DISCARDABLE "XamlPack\MeasurementPage.Compressed"

105 XAML_RESOURCE DISCARDABLE "..\Xaml\Ressources\BatteryChargerError.png"
106 XAML_RESOURCE DISCARDABLE "..\Xaml\Ressources\BatteryHigh.png"
107 XAML_RESOURCE DISCARDABLE "..\Xaml\Ressources\BatteryLow.png"
108 XAML_RESOURCE DISCARDABLE "..\Xaml\Ressources\disclaimer.png"
109 XAML_RESOURCE DISCARDABLE "..\Xaml\Ressources\easter.jpg"

如果我添加页面或其他图像,数字似乎会发生变化。

知道如何获得可用于 IXRBitmapImagePtr->SetUriSource(src);(或 IXRBitmapImage.SetUriSource(src);)的可靠 URI 吗?

我还尝试将图像作为资源添加到应用程序并像这样加载它们:

    BSTR src = TEXT("#IDB_BATTERY_HIGH_CHARGING");
    IXRApplicationPtr app;
    GetXRApplicationInstance(&app);
    HINSTANCE instance = App::GetHInstance();
    IWICBitmap* img = 0;
    HRESULT res = app->LoadImageFromResource(instance,src, L"PNG", &img);
    IXRBitmapImagePtr bitmapImage;
    app->CreateObject(IID_IXRBitmapImage, &bitmapImage);
    res = bitmapImage->SetSource(img);
    m_pBatteryStateImage->SetSource(bitmapImage);

这设置了一个不同的图像 - 但错误的图像(并且总是相同的错误图像,无论我定义哪个 src)。

我找到了解决办法。

再次将你的资源添加到"standard"资源文件(AppName.rc)并给它们一个id(你不必复制文件,可以使用原来的路径)。

例如:

 IDB_ERROR  PNG                     "..\Xaml\Ressources\Error.png"

那么你可以使用这个id:

int src = IDB_ERROR;
IXRApplicationPtr app;
GetXRApplicationInstance(&app);
HINSTANCE instance = App::GetHInstance();
IWICBitmap* img = 0;
HRESULT res = app->LoadImageFromResource(instance, MAKEINTRESOURCE(src), L"PNG", &img);
IXRBitmapImagePtr bitmapImage;
app->CreateObject(IID_IXRBitmapImage, &bitmapImage);
res = bitmapImage->SetSource(img);
m_pBatteryStateImage->SetSource(bitmapImage);

"Silverlight for Windows Embedded Developer's Guide" 说可以这样做(但我没试过):

bitmapImage->SetUriSource(L"Assets/ninthAve.png");

我想你必须添加一个“#”:

bitmapImage->SetUriSource(L"#Assets/ninthAve.png");