Для разработчиков пользовательских интерфейсов актуальна задача отображения значения типа Boolean в виде локализованной строки. Т.е. вместо "True" и "False" требуется отобразить "Да" и "Нет" (естественно в зависимости от языка ОС). В связи с этим, хочу предложить интересное решение.
Для начала следует определиться, откуда получить локализованное значение типа Boolean в человеческом виде? Для этого используем библиотеку "User32.dll", которая и вернет нам эти данные.
Как видно на скриншоте, под идентификаторами 805 и 806 имеются строки
"&Да" и "&Нет" соответственно. Вот их и будем использовать.
Чтобы долго не описывать сам процесс, приведу код самого конвертера с подробными комментариями:
BooleanToStringConverter.cs:
using System;
using System.Globalization;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Data;
namespace WpfCsharp.Converters
{
[ValueConversion(typeof(Boolean), typeof(String))]
public sealed class BooleanToStringConverter : IValueConverter
{
#region Ctor
static BooleanToStringConverter()
{
var stringBuilder = new StringBuilder(256);
var user32 = LoadLibrary(Path.Combine(Environment.SystemDirectory, "User32.dll"));
LoadString(user32, 805, stringBuilder, stringBuilder.Capacity);
Yes = stringBuilder.ToString().Replace("&", "");
LoadString(user32, 806, stringBuilder, stringBuilder.Capacity);
No = stringBuilder.ToString().Replace("&", "");
}
#endregion
#region Static Members
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax);
[DllImport("kernel32")]
static extern IntPtr LoadLibrary(string lpFileName);
public static string Yes { get; private set; }
public static string No { get; private set; }
#endregion
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Yes : No;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
}
Реализацию "ConvertBack" оставил на ваше усмотрение.
Как теперь его использовать, приведу ниже:
MainWindow.xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfcsharp="clr-namespace:WpfCsharp.Converters"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<wpfcsharp:BooleanToStringConverter x:Key="booleanToStringConverter"/>
</Window.Resources>
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<CheckBox Content="{Binding IsChecked, RelativeSource={RelativeSource Self}, Converter={StaticResource booleanToStringConverter}}"/>
<CheckBox Content="{Binding IsChecked, RelativeSource={RelativeSource Self}, Converter={StaticResource booleanToStringConverter}}"/>
</StackPanel>
</Window>
В результате мы получим локализованное значение типа Boolean в читаемом виде:
Комментариев нет:
Отправить комментарий