Как сослаться на файл.resx в приложении Windows 8.1 (WinRT)?
В моем решении у меня есть следующие типы проектов:
Просмотры
- Windows Phone 8.1 (универсальный)
- Windows 8.1 (универсальная)
- Windows Phone 8.0
Посмотреть модель
- Переносимый проект (пространство имен xxx.Common)
Посмотреть модель
В портативном проекте у меня есть .resx
файл с Access Modifier
установлен в Public
(Портативные проекты только поддержка .resx
файлы)
xxx.Commom\Resources\ViewResources.resx
Затем для доступа к ресурсу у меня есть оболочка под названием ResourceAccess.cs
Я должен сделать обертку, потому что .resx
генерирует internal
конструктор.
namespace xxx.Common.Resources
{
public class ResourceAccessor
{
private static ViewResources _appResources;
public static ViewResources AppResources
{
get
{
if(_appResources== null)
{
_appResources= new ViewResources();
}
return _appResources;
}
}
}
}
Посмотреть
В представлении для проектов Windows Phone 8.0 и Windows 8.1 у меня есть файл с именем LocalizedStrings.cs
using xxx.Common.Resources;
namespace xxx
{
public class LocalizedStrings
{
public ViewResources LocalizedResources { get { return ResourceAccessor.AppResources; } }
}
}
Файл app.xaml
Проект Windows Phone 8.0
<Application.Resources>
<local:LocalizedStrings xmlns:local="clr-namespace:xxx" x:Key="LocalizedStrings"/>
</Application.Resources>
Общий проект Windows 8.1
<Application
xmlns:local="using:xxx">
<Application.Resources>
<local:LocalizedStrings x:Key="LocalizedStrings"/>
</Application.Resources>
</Application>
Main.xaml
В проекте Windows Phone 8.0 это работает:
<TextBlock Text="{Binding Path=LocalizedResources.CommonResxText, Source={StaticResource LocalizedStrings}}"/>
Но в проекте Windows 8.1 вышесказанное не работает.
Как вы ссылаетесь на строку в .resx
файл в Windows 8.1 (WinRT)?
Я рассмотрел Использование строковых ресурсов из MSDN, но это не помогает мне, так как я не могу изменить resx
в resw
в портативном проекте (который буквально только ссылки .Net
).
2 ответа
После долгого взгляда на этот вопрос
Я видел, что мои привязки в моем проекте Windows 8.1 были неправильными, и это правильная привязка
<TextBlock Text="{Binding Source={StaticResource LocalizedStrings}, Path=LocalizedResources.CommonResxText}"/>
PS
Этот подход работает... в Debug
Когда проект находится в Release
это не так.
В автоматически сгенерированном файле ViewResources.Designer.cs
System.Resources.ResourceManager.GetString("CommonResxText", resourceCulture);
выдает исключение, потому что строки не существуют в сборке; они не скомпилированы в двоичный файл в Release
Подробнее об этой проблеме читайте здесь
Зачем вам все классы-обертки? Почему бы не обратиться к содержимому файла ресурсов напрямую?
Для этого вы просто заставляете файл ресурсов генерировать код (с помощью Access Modifier: Public в поле со списком на экране.resx), а затем привязываете текст непосредственно к представлению, например так:
<TextBlock Text="{x:Static resx:ViewResources.MyText}" />
Просто добавьте resx в качестве пространства имен xml в вашем Window/UserControl:
<Window xmlns:resx="clr-namespace:xxx.Common.Resources" ... />