2016-11-16 2 views
0

Я пытаюсь загрузить в runtime ResourceDictionary, который хранится в файле. В C# это выглядит просто какЗагрузка ResourceDictionary в код позади в UWP/C++

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

, но тот же код (в C++/см) не работают:

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

Как я понимаю, этот код должен выполняться сразу после InitializeComponent() в App.xaml .cpp. Источник установлен правильно (создание URI выполняется без каких-либо ошибок).

MergedDictionaries->Append(rd) Последняя строка генерирует исключение:

Исключение брошено в 0x7464A6F2 (KernelBase.dll) в wp_UWP.exe: 0x40080201: WinRT родиной происхождения ошибок (параметры: 0x8000ffff, 0x00000016, 0x0D30F274). Исключение бросили в 0x7464A6F2 в wp_UWP.exe: исключение Microsoft C++: платформа :: COMException^в ячейке памяти 0x0D30F714. HRESULT: Неисправность 0x8000FFFF Катастрофические WinRT информация: Разрушительный сбой

Необработанное исключение в 0x0C9E571A (Windows.UI.Xaml.dll) в wp_UWP.exe: 0xC000027B: приложение-внутреннее исключение произошло (параметры: 0x00F1CA10, 0x00000002).

Как исправить этот код? Я не понимаю, почему он выбрал исключение «Катастрофической неудачи».

ответ

0

Вы можете поместить код каждый раз, когда вы инициализировать главную страницу или в конструкторе главной странице, и она будет работать нормально:

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; 
     } 
     .. 
     .. 
    } 
    .. 
    .. 
} 

Похоже, он работает практически везде, за исключением приложения конструктора, и я понятия не имею, почему в том, что.

+0

Как выяснилось, проблемы с OnLaunched() и исправлениями в App.xaml, которые имеют некоторые проблемы, сработали. Спасибо :) –

Смежные вопросы