Как сослаться на файл.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" ... />
Другие вопросы по тегам