Есть ли простой способ динамически обнаружить все файлы XAML во всех загруженных в данный момент модулях (в частности, в приложении Silverlight Prism)? Я уверен, что это возможно, но не уверен, с чего начать.
Это должно происходить в клиенте Silverlight: мы, конечно, могли бы анализировать проекты на машине разработчика, но это снизило бы гибкость и включило бы неиспользуемые файлы в поиск.
В основном мы хотим иметь возможность анализировать все файлы XAML в очень большом проекте Prism (независимо от их загрузки), чтобы идентифицировать все строки локализации. Это позволит нам создать исходную базу данных локализации, которая включает все наши строки привязки ресурсов, а также создать поиск, в каких файлах XAML они встречаются (чтобы облегчить редактирование переводчикам).
Зачем это нужно ?: Худшее для переводчиков - изменить строку в одном контексте только для того, чтобы обнаружить, что она использовалась где-то в другом месте с немного другим значением. Мы разрешаем контекстное редактирование переводов из самого приложения.
Стандартный метод итерации сборок недоступен для Silverlight из-за ограничений безопасности. Это означает, что единственное улучшение решения, приведенного ниже, - это сотрудничество с модулем управления Prism, если это возможно. Если кто-то хочет предоставить решение кода для этой последней части этой проблемы, есть моменты, которыми можно поделиться с вами!
Итерация содержимого файлов XAP в модульном проекте кажется действительно удобным вещь, которую можно сделать по разным причинам, поэтому добавьте еще 100 представителей, чтобы получить реальный ответ (желательно рабочий пример кода). Ура и удачи!
Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.
Проблема 1 - все модули Если кто-то хочет предоставить решение кода для этой последней части этой проблемы, есть моменты, которыми можно поделиться с вами!
Итерация содержимого файлов XAP в модульном проекте кажется действительно удобным вещь, которую можно сделать по разным причинам, поэтому добавьте еще 100 представителей, чтобы получить реальный ответ (желательно рабочий пример кода). Ура и удачи!
Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.
Проблема 1 - все модули Если кто-то хочет предоставить решение кода для этой последней части этой проблемы, есть моменты, которыми можно поделиться с вами!
Итерация содержимого файлов XAP в модульном проекте кажется действительно удобным вещь, которую можно сделать по разным причинам, поэтому добавьте еще 100 представителей, чтобы получить реальный ответ (желательно рабочий пример кода). Ура и удачи!
Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.
Проблема 1 - все модули
Итерация содержимого XAP-файлов в модульном проекте кажется действительно удобной вещью, которую можно сделать по разным причинам, поэтому нужно добавить еще 100 повторений, чтобы получить реальный ответ (предпочтительно рабочий пример кода). Ура и удачи!
Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.
Проблема 1 - все модули
Итерация содержимого XAP-файлов в модульном проекте кажется действительно удобной вещью, которую можно сделать по разным причинам, поэтому нужно добавить еще 100 повторений, чтобы получить реальный ответ (предпочтительно рабочий пример кода). Ура и удачи!
Ниже приведен код, который я придумал, который представляет собой комбинацию методов из по этой ссылке на встроенных ресурсах (как было предложено Otaku) и моя собственная итерация каталога модулей Prism.
Проблема 1 - все модули который представляет собой сочетание методов из , этой ссылки на Встроенные ресурсы (как было предложено Otaku) и моей собственной итерации Каталога модулей Prism.
Проблема 1 - все модули который представляет собой сочетание методов из , этой ссылки на Встроенные ресурсы (как было предложено Otaku) и моей собственной итерации Каталога модулей Prism.
Проблема 1 - все модули уже загружен, так что это в основном нужно загрузить их все за секунду время, как я не могу понять, как перебрать все загруженные в данный момент модули Prism. Если кто-то хочет поделиться наградой на этом вы все еще можете помочь сделать это полное решение!
Проблема 2 - Очевидно, это ошибка в ResourceManager, который требует вы получите поток известных ресурс, прежде чем он позволит вам перебрать все элементы ресурсов (см. примечание в коде ниже). Это означает, что у меня должен быть фиктивный файл ресурсов в каждом модуле. Было бы неплохо узнать, почему требуется этот первоначальный вызов GetStream (или как его избежать).
private void ParseAllXamlInAllModules ()
{
IModuleCatalog mm = this.UnityContainer.Resolve ();
foreach (модуль var в миллиметрах. модули)
{
строка xap = module.Ref;
WebClient wc = новый WebClient ();
wc.OpenReadCompleted + = (s, args) =>
{
если (args.Error == null)
{
var resourceInfo = новый StreamResourceInfo (args.Result, null);
var file = new Uri ("AppManifest.xaml", UriKind.Relative);
var stream = System.Windows.Application.GetResourceStream (resourceInfo, файл);
Читатель XmlReader = XmlReader.Create (stream.Stream);
var parts = new AssemblyPartCollection ();
если (reader.Read ())
{
reader.ReadStartElement ();
if (reader.ReadToNextSibling ("Deployment.Parts"))
{
while (reader.ReadToFollowing ("AssemblyPart"))
{
parts.Add (new AssemblyPart () {Source = reader.GetAttribute ("Source")});
}
}
}
foreach (часть var по частям)
{
var info = new StreamResourceInfo (args.Result, null);
Сборка assy = part.Load (System.Windows.Application.GetResourceStream (информация, новый Uri (part.Source, UriKind.Relative)). Stream);
// Получаем имена встроенных ресурсов
строка [] ресурсы = assy.GetManifestResourceNames ();
foreach (ресурс var в ресурсах)
{
если (! resource.Contains ("DummyResource.xaml"))
{
// чтобы получить актуальные значения - создаем таблицу
var table = new Dictionary ();
// Все ресурсы имеют в названии «.resources» - удалите его
var rm = new ResourceManager (resource.Replace (". resources", String.Empty), assy);
// Кажется, здесь какая-то проблема, но без получения реального потока следующий оператор не работает ....
var dummy = rm.GetStream ("DummyResource.xaml");
var rs = rm.GetResourceSet (Thread.CurrentThread.CurrentUICulture, false, true);
Перечислитель IDictionaryEnumerator = rs.GetEnumerator ();
пока (перечислитель.MoveNext ())
{
if (enumerator.Key.ToString (). EndsWith (". xaml"))
{
table.Add (enumerator.Key.ToString (), enumerator.Value as Stream);
}
}
foreach (var xaml в таблице)
{
TextReader xamlreader = новый StreamReader (xaml.Value);
строковое содержимое = xamlreader.ReadToEnd ();
{
// Здесь я работаю над содержимым XAML
}
}
}
}
}
}
};
// Выполняем фактическое чтение для запуска вышеуказанного кода обратного вызова
wc.OpenReadAsync (новый Uri (xap, UriKind.RelativeOrAbsolute));
}
}