gpt4 book ai didi

c# - 如何构建字符串以动态访问 .resx 资源

转载 作者:太空宇宙 更新时间:2023-11-03 15:32:38 25 4
gpt4 key购买 nike

我想知道如何动态构建一个字符串来引用我的 Resources.resx 文件中的一个字符串?我基本上想在 XAML 中执行以下等效操作:

这样我就可以获得标题为 ToyBlockNameToyBallName 的资源,它们应该来自 resx,以便在必要时进行翻译。然后我希望将这些单独的字符串插入到其他字符串的格式中。有很多字符串使用这些名称,所以最好是我可以替换单个单词,而不是为我拥有的每种玩具使用每个字符串的版本。

一些示例字符串是The {0} comes in a box.{0} 只需几美元。

基本上尝试在 XAML 中执行此操作:

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

(其中 ToyName = "Block"或 "Ball"等)

有没有一种方法可以在 XAML 中完成此操作,或者是否有其他我没有想到的方法?

最佳答案

我认为仅使用 XAML 是不可能做到这一点的,但我们正在使用转换器来做到这一点。它可能会变得非常困惑,但是如果你比我设计得更好,它就会有更大的潜力,并且它会让代码变得更好 IMO。

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}" />

或者仅来自绑定(bind)变量的值(可以是任何类型的对象)

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

或者来自绑定(bind)变量的值+可以解析的复杂参数

<TextBlock Text="{Binding SomeBoundValue 
Converter={StaticResource Loc},
ConverterParameter=SomeMoreComplex|Parameter}" />

关于c# - 如何构建字符串以动态访问 .resx 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33243727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com