在UWP / C ++中的代码中加载ResourceDictionary

时间:2016-11-16 01:42:25

标签: uwp win-universal-app c++-cx

我正在尝试在运行时加载存储在文件中的ResourceDictionary。在C#中,它看起来简单为

ResourceDictionary resourceDictionary = new ResourceDictionary();
resourceDictionary.Source = new Uri("ms-appx:///!UWP/Styles/UWPDictionary.xaml", UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(resourceDictionary);

但相同的代码(在c ++ / cx中)无效:

auto rd = ref new ResourceDictionary();
rd->Source = ref new Uri("ms-appx:///!UWP/Styles/UWPDictionary.xaml");
Application::Current->Resources->MergedDictionaries->Append(rd);

我得到它,这个代码应该在App.xaml.cpp的构造函数中InitializeComponent()之后执行。源设置正确(创建URI时没有任何错误)。

最后一行MergedDictionaries->Append(rd)抛出异常:

  

在wp_UWP.exe中的0x7464A6F2(KernelBase.dll)抛出异常:0x40080201:WinRT发起错误(参数:0x8000FFFF,0x00000016,0x0D30F274)。   在wp_UWP.exe中的0x7464A6F2处抛出异常:Microsoft C ++异常:Platform :: COMException ^在内存位置0x0D30F714。 HRESULT:0x8000FFFF灾难性的失败   WinRT信息:灾难性故障

     

wp_UWP.exe中0x0C9E571A(Windows.UI.Xaml.dll)的未处理异常:0xC000027B:发生了应用程序内部异常(参数:0x00F1CA10,0x00000002)。

如何修复此代码?我不明白为什么会抛出这种“灾难性失败”的例外。

1 个答案:

答案 0 :(得分:2)

您可以在初始化主页面时或在主页面的构造函数中放置代码,它可以正常运行:

void App::OnLaunched
(Windows::ApplicationModel::Activation::LaunchActivatedEventArgs^ e)
{  
    auto rootFrame = dynamic_cast<Frame^>(Window::Current->Content);

    // Do not repeat app initialization when the Window already has content,
    // just ensure that the window is active
    if (rootFrame == nullptr)
    {
       // Load the dictionary if not already loaded
       if (!resourcesLoaded) {
          auto rd = ref new ResourceDictionary();
          rd->Source = ref new Uri("ms-appx:///Dictionary.xaml");
          Application::Current->Resources->MergedDictionaries->Append(rd);
          resourcesLoaded = true;
       }
       .. 
       ..
   }
   ..
   ..
}

除了app构造函数之外,看起来它实际上无处不在,我不知道为什么会这样。