拦截与转换器绑定的资源

时间:2016-02-18 22:36:37

标签: c# wpf xaml converter

我在解决方案AppResources的单独项目中拥有我的本地化文本资源。这允许付费翻译人员在没有整个应用程序源代码的情况下处理资源转换。

在我的窗口中,我声明了名称空间:

xmlns:viewProperties="clr-namespace:AppResources.Properties;assembly=AppResources"

示例控件:

<TextBlock VerticalAlignment="Center" 
  Margin="3" 
  Text="{x:Static viewProperties:Resources.TextBlockUserName}" />

这一切都正常。我改变了文化,使用了适当的资源。我试图通过XAML中的自动完成来保持viewProperties:Resources中的键可以获得的好处,所以我们知道它在那里。

我希望在这里添加某种转换器来拦截资源字符串值,并执行以下两项操作之一:

  • 传递获取的资源字符串值(例如,文化是日语,发送本地化文本)
  • 显示从控件
  • 请求的资源键的名称

这样做的原因是提供一个应用程序选项进入&#34;翻译模式&#34;而不是显示翻译的资源文本,如确定,取消,保存等,应用程序将显示键名称(例如Button_OK,Button_Cancel,File_Save或其他任何键名称)。这对于了解译者试图理解的内容非常方便。

无论如何,我试图使用的转换器有效,但并不理想:

public class TranslationKeyInterceptor : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        //Can do this, but this is horrible
        string resourceName = value.ToString().Replace("x:Static viewProperties:Resources.", string.Empty);

        string resourceString = string.Empty;
        if (AppOptions.DisplayLanguageKeys)
        {
            resourceString = resourceName;
        }
        else
        {
            resourceString = AppResources.Properties.Resources.ResourceManager.GetString(resourceName);
        }

        return resourceString;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return null;
    }

}

它获得的值是来自XAML的整个路径,因此我无法解析出密钥名称。

同样,XAML变得有点麻烦,因为我需要

<TextBlock VerticalAlignment="Center" 
  Margin="3" 
  Text="{x:Static viewProperties:Resources.TextBlockUserName, 
  Converter={StaticResource Converter_Translate}}" />

其中

    <wpfTools:TranslationKeyInterceptor x:Key="Converter_Translate"/>

在我的Window的资源中声明。

所以我的问题是:

  • 我可以以某种方式将存在于AppResources.Properties.Resources中的实际字符串属性传递给转换器,以便在XAML中维护自动完成并使用该名称来执行我的选项逻辑吗?
  • 实现此目的的最佳方式是什么&#34;文本拦截&#34;并让资源文本通过或捕获XAML中要求的人,而是返回所请求的密钥的名称?

0 个答案:

没有答案