Добавить текст к статическому ресурсу

Если у меня есть метка:

<Label Content="{StaticResource Foo}" />

Есть ли способ добавить * в xaml?

Я ищу что-то вроде:

<Label Content="{StaticResource Foo, stringformat={0}*" />

Я размещаю содержимое своих элементов управления из словаря ресурсов, поскольку приложение поддерживает несколько языков. Мне было интересно, могу ли я добавить * в xaml, чтобы мне не нужно было создавать событие, а затем добавлять его, когда это событие срабатывает.

Редактировать:

В словаре ресурсов у меня есть:

 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:system="clr-namespace:System;assembly=mscorlib"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                >

     <system:String x:Key="Foo">Name</system:String>

 </ResourceDictionary>

в моем окне у меня есть: (сливаю последний словарь)

  <Label Content="{StaticResource 'Foo'}" />

и это отображает имя

Я хочу, чтобы на ярлыке отображалось имя*, а не просто имя

Может быть, это удастся достичь с помощью стиля.


person Tono Nam    schedule 16.04.2012    source источник


Ответы (2)


Есть несколько способов сделать это:

  1. С ContentStringFormat:

    <Label Content="{StaticResource Foo}" ContentStringFormat='{}{0}*'/>
    
  2. С связыванием с StringFormat (это только работайте со строковыми свойствами, поэтому вам нужно использовать TextBlock в качестве содержимого Label)

    <Label>
       <TextBlock 
           Text="{Binding Source={StaticResource Foo}, StringFormat='{}{0}*'}"/>
    </Label>
    
  3. Или вы можете написать преобразователь, чтобы добавить *
person nemesv    schedule 16.04.2012
comment
Спасибо, это полезно знать. Однако это не добавляет *. Я думаю, что мне может понадобиться конвертер. Буду читать об этом и пробовать. - person Tono Nam; 17.04.2012
comment
Можете ли вы уточнить, что часть * не добавляется? Потому что я протестировал оба решения в образце приложения, и они работают. Можете ли вы также попробовать это в новом проекте (WPF .NET 4.0), потому что, возможно, в вашем проекте есть что-то еще, что вызывает здесь проблемы. - person nemesv; 17.04.2012
comment
Я смог заставить его работать с конвертером. Я не знаю, почему строковый формат не работал. возможно, потому что я загружаю словарь во время выполнения, потому что приложение поддерживает несколько языков. В любом случае я опубликую рабочее решение, которое я получил благодаря вашему ответу. Спасибо! - person Tono Nam; 17.04.2012

благодаря ответу @nemesv вот что у меня получилось:

Я создал следующий преобразователь:

using System;
using System.Windows.Data;
using System.Globalization;

namespace PDV.Converters
{
    [ValueConversion(typeof(String), typeof(String))]
    public class RequiredFieldConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value.ToString() + "*";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var str = value.ToString();
            return str.Substring(0, str.Length - 2);
        }
    }
}

В моем файле app.xaml я создал ресурс

<Application x:Class="PDV.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"

             xmlns:conv="clr-namespace:PDV.Converters"  <!--  Include the namespace where converter is located-->
             >
    <Application.Resources>
        <ResourceDictionary >
            <conv:RequiredFieldConverter x:Key="RequiredFieldConverter" />
        </ResourceDictionary>
    </Application.Resources>

</Application>

то в любом месте моего приложения я смогу использовать этот преобразователь как:

    <Label Content="{Binding Source={StaticResource NameField}, Converter={StaticResource RequiredFieldConverter} }" />
person Tono Nam    schedule 16.04.2012