Конструктор ресурсов Silverlight всегда возвращается к внутреннему

Когда я изменяю свой файл ресурсов (.resx), добавляю текст или изменяю, конструктор моего ресурса всегда переходит во внутренний, и после этого, когда я запускаю свой Silverlight, у меня возникает ошибка в моей привязке XAML.

Есть ли способ избежать этого сценария? Мне нужно зайти в конструктор моего ресурса и выложить конструктор на всеобщее обозрение, чтобы решить проблему

Я использую свой ресурс, как это в моем файле xaml

 <UserControl.Resources>
        <resources:LibraryItemDetailsView x:Key="LibraryItemDetailsViewResources"></resources:LibraryItemDetailsView>
    </UserControl.Resources>


<TextBlock FontSize="12" FontWeight="Bold" Text="{Binding Path=FileSelectedText3, Source={StaticResource LibraryItemDetailsViewResources}}"></TextBlock>

person Cédric Boivin    schedule 19.10.2010    source источник
comment
У меня такая же проблема, раздражает...   -  person Rumplin    schedule 17.01.2011
comment
Я сделал это в WPF, должно работать и для Silverlight.   -  person Mike Fuchs    schedule 24.04.2013


Ответы (7)


Другой способ сделать это без изменения кода, как показано ниже. Работал хорошо для меня.

http://guysmithferrier.com/post/2010/09/PublicResourceCodeGenerator-now-works-with-Visual-Studio-2010.aspx

person Gavin    schedule 11.02.2011
comment
Это лучший ответ. Установите исполняемый файл и задайте для свойства Custom Tool вашего файла ресурсов значение PublicResourceCodeGenerator. - person bkaid; 30.11.2011

Вы можете создать общедоступный класс, который предоставляет ресурсы через свойство:

public class StringsWrapper
{
    private static LibraryItemDetailsView _view = null;

    public LibraryItemDetailsView View
    {
        get
        {
            if (_view == null)
            {
                _view = new LibraryItemDetailsView();
            }
            return _view;
        }
    }
}

Затем в вашем XAML вы можете получить доступ к своему ресурсу:

<UserControl.Resources>
    <StringsWrapper x:Key="LibraryItemDetailsViewResources"></StringsWrapper>
</UserControl.Resources>


<TextBlock FontSize="12" FontWeight="Bold" Text="{Binding Path=View.FileSelectedText3, Source={StaticResource LibraryItemDetailsViewResources}}"></TextBlock>

Таким образом, конструктор resx может быть внутренним!

person Alex B    schedule 22.12.2010

Ну, что я сделал, так это добавил утилиту командной строки в событие предварительной сборки каждого проекта Silverlight, которая заменяет каждый internal string на public :)

Вы можете редактировать события до и после сборки: щелкнув проект правой кнопкой мыши -> Properties -> Build Events.

Я использовал утилиту под названием RXFIND, она бесплатна и может заменить строку в выбранных файлах с помощью RegEx регулярное выражение.

Вот командная строка, которую я использую:

"$(SolutionDir)ThirdParty\rxfind\rxfind.exe" "$(ProjectDir)Resources\*.Designer.cs" "/P:internal " "/R:public " /Q /B:2

Обратите внимание, что все мои ресурсы расположены в каталоге ресурсов в каждом проекте, а утилита командной строки находится в каталоге \ThirdParty\rxfind.

person michal    schedule 27.02.2012

У меня тоже такая же ошибка. Чтобы решить проблему, я только что создал public class, который наследуется от класса, представляющего файл ресурсов, зная, что он также должен быть общедоступным классом, это мой exep:

public class TrackResourceWrapper : TrackResource
{
}

с: TrackResourceWrapper наследует класс TrackResource это класс, который находится в файле ресурсов кода позади (общедоступный класс)

person ANADI Juba    schedule 26.08.2013

Просто:

  1. Добавьте новый класс, наследуемый от класса ресурса.
  2. В файле App.xaml измените созданный класс ресурсов.

Сделанный!

person tiagosito    schedule 18.02.2016

Причина этого в том, что вы не должны создавать экземпляр класса самостоятельно. Вместо этого вы всегда должны использовать ConsoleApplication1.Resource1.ResourceManager, который сам создает экземпляр класса для вас.

Здесь ConsoleApplication1 — это имя вашей сборки, а Resource1 — имя вашего файла ресурсов.

person Pieter van Ginkel    schedule 19.10.2010
comment
Можете ли вы привести пример с привязкой? - person Cédric Boivin; 19.10.2010
comment
Упомянутый вами ResourceManager не предоставляет строковые переменные, поэтому его нельзя привязать. Вам нужно будет использовать метод GetX, чтобы получить от него какие-либо значения. - person AlignedDev; 18.02.2011

Я создал макрос, чтобы сделать это для меня для каждого файла, который я редактирую. Мне все еще нужно помнить, чтобы запустить его, но это намного быстрее. См. мой пост.

person AlignedDev    schedule 28.02.2012