xaml - 如何添加:带有文本值动态绑定的标签?
问题描述
如何在 xamarin.forms 中的 xaml 中添加字符串。我有一个来自应用程序资源文件的文本(i18n:Translate Text=Supplier)。现在有了这段文字,我还添加了:在这段文字之后。我不想在带有文本的应用程序资源中添加 :。我只想在 xaml 上这样做。我尝试使用 StringFormat 但不知道该怎么做。
解决方案
您可以使用值转换器来更改绑定上的值,但这很棘手,因为在使用 i18n:Translate 时无法轻松添加转换器。但我仍然看到您的问题的三种可能解决方案:
1. 没有值转换器的属性
最简单的方法是创建一个获取翻译文本的属性,然后在文本中添加一个冒号:
视图模型:
public string Supplier
{
get { return AppResources.Supplier + ":"; }
}
XAML:
<Label Text="{Binding Supplier}"/>
2.带有值转换器的属性
另一种方法是创建一个获取翻译文本的属性,然后通过值转换器添加冒号:
视图模型:
public string Supplier
{
get { return AppResources.Supplier; }
}
转换器类:
public class ColonConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value += ":";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.ToString().Remove(value.ToString().Length - 1);
}
}
XAML:
<ContentPage.Resources>
<ResourceDictionary>
<local:ColonConverter x:Key="ColonConverter" />
</ResourceDictionary>
</ContentPage.Resources>
...
<Label Text={Binding Supplier, Converter={StaticResource ColonConverter}}"/>
3. 创建您自己的翻译扩展和值转换器
我没有对此进行测试,但我发现了这个 SO 答案,它提供了一个关于如何实现这一目标的示例。这样您就不需要向 ViewModel 添加属性,因此您只需在设置翻译扩展和转换器后调整您的 XAML。但是编写自己的翻译扩展需要一些工作。
自定义翻译扩展:
[ContentProperty("Text")]
public class TranslateExtension : IMarkupExtension
{
const string ResourceId = "Project.Resources.AppResources";
public string Text { get; set; }
public IValueConverter Converter { get; set; }
public object ProvideValue(IServiceProvider serviceProvider)
{
if (Text == null)
return null;
ResourceManager resourceManager = new ResourceManager(ResourceId, typeof(TranslateExtension).GetTypeInfo().Assembly);
string translatedText = resourceManager.GetString(Text, CultureInfo.CurrentCulture);
if (this.Converter != null)
{
translatedText = Converter.Convert(translatedText, typeof(string), null, CultureInfo.CurrentCulture).ToString() ?? translatedText;
}
return translatedText;
}
}
XAML:
xmlns:strings="clr-namespace:Project.Utils;assembly=Project"
<ContentPage.Resources>
<ResourceDictionary>
<converters:ColonSpaceConverter x:Key="ColonSpaceConverter" />
</ResourceDictionary>
</ContentPage.Resources>
<Label Text="{strings:Translate Money, Converter={StaticResource ColonSpaceConverter}}" />
推荐阅读
- django - Django:无法为用于检索数据的模型实例化抽象模型
- python - Simpleaudio 没有在 crontab 下运行
- c++ - for_each 作为 lambda 函数
- javascript - 权限覆盖不适用于 discordjs
- asp.net-core - 在 Windows Server 2016 上发布 IIS 10 后将 Blazor webassembly 放在哪里?
- r - 想要将excel文件中的日期链接到R中FASTA文件中的每个fasta
- haxeflixel - 如何修复ninjamuffin 99从源代码编译Friday Night Funkin但编译后没有.exe?
- python - PyCryptoDome AES CBC 文档代码给出不同的输出
- python - 在随机坐标数组中使用colliderect
- git - 如何最好地从 ADO 中的提交/工作项创建发行说明