Синтаксический анализатор XAML не может найти ресурс в динамически загружаемом XAP при создании экземпляра формы

Я следил за видео Тима Хойера о динамической загрузке других XAP (в «главное» приложение Silverlight), а также за некоторыми другими ссылками для настройки загрузки ресурсов, и я застрял на конкретной проблеме загрузки ресурсов стиля из динамически загружаемого XAP (т.е. содержимое Assets \ Styles.xaml). Когда я запускаю приложение master / hosting, оно успешно передает динамический XAP, и я могу читать информацию о развертывании и т. Д. И загружать части сборки. Однако, когда я действительно пытаюсь создать экземпляр формы из динамического XAP, он терпит неудачу.

Не удается найти ресурс с именем / ключом LayoutRootGridStyle

который находится в файле Assets \ Styles.xaml (он работает, если я запускаю его напрямую, поэтому я знаю, что все в порядке). По какой-то причине они не отображаются как ресурсы приложения - не уверен, что я ошибся концом палки или просто что-то упустил? Фрагмент кода ниже (извините, он немного запутан - просто пытаюсь сначала заставить его работать) ...

'' # Here's the code that reads the dynamic XAP from the web server ...
'' #...
wCli = New WebClient
AddHandler wCli.OpenReadCompleted, AddressOf OpenXAPCompleted
wCli.OpenReadAsync(New Uri("MyTest.xap", UriKind.Relative))
'' #...

'' #Here's the sub that's called when openread is completed 
'' #...
Private Sub OpenXAPCompleted(ByVal sender As Object, ByVal e As      System.Net.OpenReadCompletedEventArgs)
Dim sManifest As String = New StreamReader(Application.GetResourceStream(New     StreamResourceInfo(e.Result, Nothing), New Uri("AppManifest.xaml", UriKind.Relative)).Stream).ReadToEnd

Dim deploymentRoot As XElement = XDocument.Parse(sManifest).Root
Dim deploymentParts As List(Of XElement) = _
        (From assemblyParts In deploymentRoot.Elements().Elements() Select assemblyParts).ToList()

Dim oAssembly As Assembly = Nothing
For Each xElement As XElement In deploymentParts
    Dim asmPart As AssemblyPart = New AssemblyPart()
    Dim source As String = xElement.Attribute("Source").Value
    Dim sInfo As StreamResourceInfo = Application.GetResourceStream(New StreamResourceInfo(e.Result, "application/binary"), New Uri(source, UriKind.Relative))
    If source = "MyTest.dll" Then
        oAssembly = asmPart.Load(sInfo.Stream)
    Else
        asmPart.Load(sInfo.Stream)
    End If
Next

Dim t As Type() = oAssembly.GetTypes()

Dim AppClass = (From parts In t Where parts.FullName.EndsWith(".App") Select parts).SingleOrDefault()
Dim mykeys As Array

If Not AppClass Is Nothing Then
    Dim a As Application = DirectCast(oAssembly.CreateInstance(AppClass.FullName), Application)

    For Each strKey As String In a.Resources.Keys
        If Not Application.Current.Resources.Contains(strKey) Then
            Application.Current.Resources.Add(strKey, a.Resources(strKey))
        End If
    Next
End If

Dim objectType As Type = oAssembly.GetType("MyTest.MainPage")
Dim ouiel = Activator.CreateInstance(objectType)
Dim myData As UIElement = DirectCast(ouiel, UIElement)
Me.splMain.Children.Add(myData)
Me.splMain.UpdateLayout()
End Sub
'' #...

'' # And here's the line that fails with "Cannot find a Resource with the Name/Key      LayoutRootGridStyle"
'' #  ...
System.Windows.Application.LoadComponent(Me, New     System.Uri("/MyTest;component/MainPage.xaml", System.UriKind.Relative))
'' #...

Просто чтобы повторить, есть 3 сценария, которые следует рассмотреть ... 1) Динамически загружаемые ресурсы стиля XAP остаются в объединенном словаре ресурсов (в отдельном файле xaml), на который ссылается app.xaml динамически загружаемого приложения Silverlight (XAP) - При запуске главного приложения ресурсы динамического XAP не отображаются в текущем приложении (после загрузки частей сборки XAP). Произошла ошибка.

2) Динамически загружаемые ресурсы стиля XAP перемещаются из объединенного словаря ресурсов (из отдельного файла xaml) в app.xaml динамического приложения вместо ссылки на объединенный словарь ресурсов. - При запуске главного приложения ресурсы из динамического XAP DO кажутся присутствующими в текущем приложении (после загрузки частей сборки XAP). Однако ошибка все равно возникает.

3) Динамически загружаемые ресурсы стиля XAP копируются в app.xaml вызывающего / главного приложения (нежелательно). - Ошибка больше не возникает.


person Tom    schedule 11.05.2010    source источник
comment
Между прочим, если я перемещаю ресурсы стиля непосредственно в app.xaml динамически загружаемого XAP (и удаляю ссылку на объединенные словари на файл, в котором они находились), тогда все они внезапно появляются в списке ресурсов вызывающих приложений. Однако, несмотря на то, что теперь я вижу их, я все равно получаю ошибку Cannot find a Resource with the Name / Key LayoutRootGridStyle от парсера xaml (и да, словарный ключ LayoutRootGridStyle определенно присутствует в ресурсах текущего приложения).   -  person Tom    schedule 11.05.2010
comment
Интересно, что, похоже, это сработает, если я скопирую содержимое объединенного словаря ресурсов из динамического файла XAP непосредственно в словарь ресурсов вызывающего / главного App.xaml. Но, очевидно, я не хочу этого делать, потому что хочу иметь возможность извлекать необходимые ресурсы из динамического XAML, а не «жестко кодировать» их в главном приложении.   -  person Tom    schedule 11.05.2010


Ответы (1)


Ответ предоставлен bykinag на форумах silverlight ...

Я добавил следующую строку после загрузки сборки.

App.Current.Resources.MergedDictionaries.Add (New ResourceDictionary () With {.Source = New Uri ("/ MyTest; component / Assets / Styles.xaml", UriKind.RelativeOrAbsolute)})

Теперь у меня возникла проблема, из-за которой динамическое приложение не может видеть другие страницы внутри себя (Страница не найдена), но я, вероятно, подниму ее отдельно, если не смогу ее решить.

person Tom    schedule 12.05.2010