XAML Parser не может найти ресурс в динамически загруженном XAP при создании экземпляра формы - PullRequest
4 голосов
/ 11 мая 2010

Я следил за видео Тима Хойера для динамической загрузки других 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 вызывающего / главного приложения (не желательно). - Ошибка больше не возникает.

1 Ответ

3 голосов
/ 12 мая 2010

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

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

App.Current.Resources.MergedDictionaries.Add (New ResourceDictionary () с {.Source = New Uri ("/ MyTest; компонент / Assets / Styles.xaml", UriKind.RelativeOrAbsolute)})

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

...