Расположение файла динамического ресурса Silverlight - PullRequest
2 голосов
/ 11 марта 2011

Я пытаюсь сделать ссылку на внешний файл, как в не скомпилированном приложении silverlight, для моего словаря ресурсов. Я хотел бы иметь возможность помещать «темы» в папку на моем веб-сайте и использовать их без необходимости перекомпиляции и загрузки каждый раз, когда я создаю новую.

У меня успешно меняется ресурс, но я не могу найти способ ссылки на файл, которого нет в скомпилированном приложении.

Вот что у меня есть:

private void BlueButtonClick(object sender, RoutedEventArgs e)
{
  var s = App.GetResourceStream(new System.Uri("/DynamicDictionary;component/dict2.xaml", System.UriKind.Relative)).Stream;
  var reader = new StreamReader(s);
  var xaml = reader.ReadToEnd();
  var rdd = (ResourceDictionary)XamlReader.Load(xaml);
  Resources.MergedDictionaries.Add(rdd);
  VictoryIsMine();
}

Я хотел бы иметь возможность изменить '/DynamicDictionary;component/dict2.xaml' на что-то вроде 'http://localhost:9393/dict2.xaml', но это дает мне ошибку.

У кого-нибудь есть предложения?

* РЕДАКТИРОВАТЬ **

Это выдает мне следующую ошибку, когда я пытаюсь сослаться на localhost:

{System.UriFormatException: родственник URI не может быть создан, потому что Параметр 'uriString' представляет абсолютный URI. в System.Uri.CreateThis (Строка uri, Boolean dontEscape, UriKind uriKind)
в System.Uri..ctor (String uriString, UriKind uriKind) в DynamicDictionary.MainPage.RedButtonClick (Объект отправитель, RoutedEventArgs e) в System.Windows.Controls.Primitives.ButtonBase.OnClick () в System.Windows.Controls.Button.OnClick () в System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp (MouseButtonEventArgs есть System.Windows.Controls.Control.OnMouseLeftButtonUp (Control Ctrl, EventArgs e) в MS.Internal.JoltHelper.FireEvent (IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String EventName)}

1 Ответ

3 голосов
/ 11 марта 2011

Нет практического способа получить его извне файла тем способом, который вы ищете.

У меня есть два варианта, о которых я знаю (не говоря о том, что других нет, но, как мне кажется, это обычно делается):

  1. Вы можете использовать DeploymentCatalog MEF или взять WebClient и загрузить его как сборку, используя AssemblyParts для его анализа, затем создать ссылку на словарь ресурсов и вручную добавить ее в коллекцию ресурсов для приложения

  2. Вы можете использовать WebClient, чтобы получить XAML для ресурса. Затем вы можете использовать загрузчик XAML для загрузки и обработки, а затем добавить его в коллекцию ресурсов. Однако это будет намного сложнее, потому что вы должны предвидеть пространства имен, на которые есть ссылки в XAML, и обязательно настроить и передать их загрузчику XAML

Хотя темы «XAML» выглядят «хорошо», XAML - не более чем декларативный граф объектов. Под ним - актуальный код. Таким образом, вы должны загрузить код, чтобы темы работали, и единственный способ добавить этот код в текущее развертывание - это проанализировать его как динамически добавленную сборку или загрузить XAML в пространство процесса и добавить его таким образом.

PS - Я вижу, что вы используете ридер, вместо этого вы можете попытаться передать UriKind.Absolute - если это не сработает, используйте WebClient и таким образом передайте текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...