Ответ 1
Другой способ сделать это без изменений кода - как показано ниже. Хорошо работал у меня.
Когда я изменяю свой файл ресурсов (.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>
Другой способ сделать это без изменений кода - как показано ниже. Хорошо работал у меня.
Вы можете создать открытый класс, который предоставляет ресурсы через свойство:
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 может быть внутренним!
Хорошо, что я сделал, это добавить утилиту командной строки для предварительного построения события каждого проекта 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
У меня тоже такая же ошибка. Чтобы решить проблему, я только что создал public class
, который наследуется от класса, представляющего файл ресурсов, зная, что он также должен быть открытым классом, это мой exep:
public class TrackResourceWrapper : TrackResource
{
}
с:
TrackResourceWrapper
наследует класс
TrackResource
- это класс, который находится в файле ресурса кода (public class)
Просто:
Готово!
Причиной этого является то, что вы не должны создавать экземпляр класса самостоятельно. Вместо этого вы всегда должны использовать ConsoleApplication1.Resource1.ResourceManager
, который сам создает для вас класс.
Здесь ConsoleApplication1
- имя вашей сборки и Resource1
имя вашего файла ресурсов.
Я создал макрос, чтобы сделать это для меня для каждого редактируемого файла. Я все еще должен помнить, чтобы запустить его, но это намного быстрее. Пожалуйста, смотрите мой пост.