Ресурсы в файле проекта в VS2008 творчески «повторно» используются дизайнером форм, можно избежать? - PullRequest
4 голосов
/ 12 января 2009

У нас есть несколько автоматически сгенерированных файлов ресурсов в нашем проекте в Visual Studio 2008 с некоторыми локализованными версиями, и в одной из этих локализованных версий есть строка, которая в данном случае пуста.

Более явно. У нас есть файл основных ресурсов с большим количеством строковых ресурсов. Затем у нас есть 4 другие локализованные версии этого файла, и в одном из этих других локализованных файлов одна из строк получает пустое значение.

Проблема теперь в том, что дизайнер форм очень доволен тем, что нашел ресурс для строки, и, очевидно, не остановится на повторном использовании этого ресурса для любых пустых строк, он назначит свойство в сгенерированном коде конструктора для формы .

Например, если по какой-то причине свойство в элементе управления не указано со значением по умолчанию (поэтому оно будет сериализовано в код, даже если оно пустое), тогда оно будет ссылаться на наш ресурс, а не записывать пустую строку литерал в коде C #.

Проблема в том, что он ссылается на локализованные версии, а они не скомпилированы в код.

Вот пример сокращенного кода:

this.rpAllFields.KeyTip = 
  global::namespaces.SystemMessagesResources_sv_SE.
    dash_red_shift_info_description;

В этом случае dash_red_shift_info_description не имеет значения для локали sv-SE, поэтому дизайнер, увидев в коде пустую строку, попытается связаться с этим ресурсом. Но SystemMessagesResources_sv_SE не является существующим классом, а, по-видимому, сгенерированным именем класса для шведской локализованной версии файла ресурсов SystemMessagesResources, который скомпилирован в класс.

Можно ли этого избежать? Мы довольно устали от поиска / замены каждый раз, когда что-то меняем в файлах форм, и мы почти уверены, что мы сделали что-то пощечину, чтобы это произошло, но мы очевидно, не в состоянии найти причину этого сами.

Код выше, если мы удалим ресурс, будет выглядеть так:

this.rpAllFields.KeyTip = "";

Ответы [ 4 ]

2 голосов
/ 28 января 2009

Вы можете попробовать создать строковый ресурс empty_string, определяемый как "" для каждой локали. Если вы сделаете его первым ресурсом, дизайнер форм (будем надеяться) всегда выберет его в качестве значения для разбрызгивания ваших форм. Таким образом, по крайней мере, вы будете использовать строку, предназначенную для этой цели.

2 голосов
/ 28 января 2009

Если проблема вызвана пустой строкой в ​​файле ресурсов, каков будет эффект, если сделать его пробелом? Таким образом, вместо "" файл ресурсов содержит "". Я не знаю, является ли это лучшим решением, но мне было бы интересно узнать, не мешает ли он использовать этот ресурс в качестве пустой строки по умолчанию. Тем не менее, не зная, как это используется, я не уверен, какое влияние имеет значение, которое должно быть неопределенным, можно определить как пробел ...

0 голосов
/ 27 января 2009

Будет сгенерирован файл ресурса и пример кода.

И что вы говорите: у вас есть пустое строковое литеральное определение в вашем пространстве имен (первое найденное), но это вызывает некоторые проблемы? Не будет ли он всегда пустым? Когда вы компилируете код, он делает такие странные вещи, чтобы сэкономить место. Я столкнулся с аналогичной проблемой при создании файлов XAML с codebehind для автоматической сборки файлов сборки на лету: компилятор достаточно умен, чтобы знать: «это не имеет значения, но для нас это произошло, потому что он переименовал литералы (которые были использованы в другом месте).

Чтобы обойти это, мы использовали именованные типы для этих примитивов в нашем пространстве имен и сделали его глобальным. То, что я вижу здесь, это то, что ваше глобальное пространство имен заполняет пробелы - вы можете захотеть иметь одно «ниже», которое оценивает все пустые строки.

Я не работал с этим больше года, так что простите меня, если моя формулировка плохая, но я имею в виду: подумайте XML. Вам нужно либо явно использовать пространство имен в свойствах, либо присвоить им более низкие значения (например, вложенное свойство в xaml).

Я надеюсь, что это помогает (и имеет смысл)

0 голосов
/ 27 января 2009

Сколько вам нужен ресурс, значением которого является пустая строка? Я могу представить несколько многоязычных сценариев, в которых какой-либо ключ ресурса должен соответствовать пробелу в некоторых из поддерживаемых языков (если вы используете конкатенацию строк для некоторых элементов пользовательского интерфейса), да.

Но если бы мой сценарий не был чем-то подобным, я бы просто удалил запись ресурса с пустой строкой. Я бы просто сказал: «Какой текст автономного интерфейса переводится как пустой?».

Если бы я действительно нуждался в том, чтобы ресурс был пустым в некоторых случаях (где он обозначает статью на одном языке и где нет эквивалентного слова на другом), я бы попытался выяснить, смогу ли я произвести тот же эффект другим способом.

...