Мы представили следующее пользовательское расширение разметки WPF для преобразования static object
в верхний регистр string
.
public class StaticToUpperCaseString : StaticExtension
{
public StaticToUpperCaseString()
{
}
public StaticToUpperCaseString(string member) : base(member)
{
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
var str = base.ProvideValue(serviceProvider);
return str?.ToString().ToUpper();
}
}
Использование в XAML выглядит как этот - мы заменили наше предыдущее решение ненужной привязкой.
<UserControl x:Class="…"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:resources="clr-namespace:…"
xmlns:ourNamespace="clr-namespace:…">
<Label Content={ourNamespace:StaticToUpperCaseString resources:Lang.Message />
<!-- The previous solution with unnecessary binding -->
<!-- <Label Content={Binding Source={x:Static resources:Lang.Message}, Converter={…}} /> -->
</UserControl>
Код во время выполнения работает нормально. Проблема заключается в примечании Visual Studio (2017): Псевдоним пространства имен 'resources' не требуется для кода и может быть безопасно удален . Единственное использование - это новое расширение разметки, и оно не распознается правильно. Нет проблем со стандартным StaticExtension
.
Мы пробовали атрибут [TypeConverter(typeof (StaticExtensionConverter))]
с внутренней копией WPF StaticExtensionConverter
, но это не помогает.