2015-10-20 2 views
2

Мне интересно, как я могу динамически строить строку для ссылки на строку в файле Resources.resx? Я в основном хочу сделать эквивалент следующего в XAML:Как построить строку для динамического доступа к ресурсу .resx

Это значит, что я могу получить ресурс под названием ToyBlockName или ToyBallName, который должен исходить из resx, поэтому при необходимости он может быть переведен. Затем я надеюсь подключить эти отдельные строки в форматы других строк. Есть много строк, которые используют эти имена, поэтому было бы лучше, если бы я мог заменить отдельные слова, а не иметь версию каждой строки для каждого вида игрушек, которые у меня есть.

Некоторые примеры строки The {0} comes in a box., The {0} costs only a few dollars.

По существу пытается сделать это в XAML:

String.Format(Properties.Resources.Default["ToyComesInBox"], 
    Properties.Resources.Default["Toy" + Constants.ToyName + "Name"]); 

(Где ToyName = "Блок" или "Бал", и т.д.)

Есть способ сделать это в XAML, или есть какой-то другой метод, о котором я не думаю?

+1

Почему это сделать в XAML, если у вас есть решение в C#? –

+0

Просто пытаюсь сохранить код из кода. Я мог бы просто установить эти строки при инициализации окон/элементов управления, но мне любопытно узнать, существует ли способ pure-XAML для его выполнения. – densegoo

ответ

0

Я не думаю, что это возможно сделать только с XAML, но мы делаем это с конвертером. Это может стать довольно грязным, однако, если вы создадите его лучше меня, у него будет еще больший потенциал, и он сделает код лучше ИМО.

public class LocalizationConverter : IValueConverter 
{ 
    public object Convert(
     object value, 
     Type targetType, 
     object parameter, 
     string language) 
    { 
     string valueString = value as string; 
     var paramString = parameter as string; 

     //so here you have the value of your binding in the value string 
     //and if it's empty (because you don't want to use the bound value 
     //you're setting the value string to be the param string 

     if (string.IsNullOrWhiteSpace(valueString)) 
     { 
      valueString = paramString; 
     } 

     //if value string (formerly your param string is empty just return 
     //there is no value to be found 
     if (string.IsNullOrWhiteSpace(valueString)) 
     { 
      return null; 
     } 

     //now the fun starts :) ,I pass values with small command and 
     //separator symbol to be able to parse my parameters 
     //something like this: 
     //if (paramString.StartsWith("AddAfter|")) 
     //{ 
     // var valToAppend = paramString.Substring("AddAfter|".Length); 
     // return Strings.Get(Strings.Get(valToAppend + valueString)); 
     //} 
     //and this basically does -> append the given parameter string after 
     //the part with the command to the value that comes from the binding 
     //and then uses the resulting string from res dictionary 

     //So you could do something like passing "ToyType|Block" or you can 
     //pass something in the value like Block and then in the parameters 
     //have description ToyType or even pass not string object and get 
     //what you want from it like 
     //if(value is ToyType) 
     //{ 
     // return StringsGet((value as ToyType).Name) 
     //} 


     //Your parsing logic HERE 



     //This is how we get strings from resources in our project 
     //that you already know how to do 

     return Strings.Get(valueString); 
    } 

    public object ConvertBack(
     object value, 
     Type targetType, 
     object parameter, 
     string language) 
    { 
     throw new NotImplementedException(); 
    } 

} 

Использование

Определение ресурсов (страницы или глобальный)

<converters:LocalizationConverter x:Key="Loc" /> 

Использование в XAML

Значение только от параметров (строки в данном случае)

<TextBlock Text="{Binding 
        Converter={StaticResource Loc}, 
        ConverterParameter=ToyBlockName}" /> 

или значение только из связанной переменной (может быть любой вид объекта)

<TextBlock Text="{Binding ToyBlockNameBoundValue 
        Converter={StaticResource Loc}}" /> 

Или значение из связанной переменной + комплексного параметра, которые могут быть разобраны

<TextBlock Text="{Binding SomeBoundValue 
        Converter={StaticResource Loc}, 
        ConverterParameter=SomeMoreComplex|Parameter}" /> 
Смежные вопросы