如何添加:带有标签的文本值动态绑定的标签?

时间:2018-07-12 06:17:58

标签: xaml xamarin xamarin.ios

如何在xamarin.forms中的xaml中的标签处添加字符串:。我的文字来自(i18n:Translate Text = Supplier)的应用程序资源文件。现在,在此文本之后,我还将在该文本之后添加:。我不想在文本中添加:在应用程序资源中。我只想在xaml上做到这一点。我尝试了StringFormat,但不知道该怎么办。

2 个答案:

答案 0 :(得分:0)

您可以使用Value Converter来更改Binding上的值,但这很棘手,因为在使用i18n:Translate时不容易添加转换器。但我仍然看到三种可能的解决方案来解决您的问题:

1。没有值转换器的属性

最简单的方法是创建一个属性,该属性获取翻译后的文本,然后在文本中添加冒号:

ViewModel:

public string Supplier
{
    get { return AppResources.Supplier + ":"; }
}

XAML:

<Label Text="{Binding Supplier}"/>

2。带有值转换器的属性

另一种方法是创建一个属性,该属性获取翻译的文本,然后通过值转换器添加冒号:

ViewModel:

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。创建自己的翻译扩展和价值转换器

我没有对此进行测试,但是我发现this SO answer给出了如何实现此目标的示例。这样,您无需向ViewModel添加属性,因此只需在设置Translate Extension和Converter后就调整XAML。但是需要编写自己的翻译扩展程序。

自定义TranslateExtension:

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

答案 1 :(得分:0)

这可以通过多种方式实现,草拟了其中两种:(滑动滑块时标签的值会改变)

方法一

<Label Text="Slide to change Value" 
                   VerticalOptions="CenterAndExpand"
                   HorizontalOptions="CenterAndExpand"
                   x:Name="lblSliderValue" FontSize="Title" Margin="60"></Label>
<Slider ValueChanged="Slider_ValueChanged"></Slider>

在代码隐藏文件中,

private void Slider_ValueChanged(object sender, ValueChangedEventArgs e)
    {
        lblSliderValue.Text = e.NewValue.ToString("0.00");
        lblSliderValue.BackgroundColor = Color.Black;
        lblSliderValue.TextColor = Color.White;
    }

方法二(不需要代码隐藏文件中的代码)

  <Label Text="Slide to change Value"
            VerticalOptions="Center"
            HorizontalOptions="Center"
            Text="{Binding Source={x:Reference sldExample}, Path=Value, StringFormat='{0:F2}'}"></Label>
 <Slider x:Name="sldExample" BackgroundColor="Yellow" ThumbColor="Violet"></Slider>