2017-04-10 95 views
2

我在项目中的资源文件中嵌入了ResourceDictionary。这本字典包含一堆几何图形。WPF:解析几何体忽略语言

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Geometry x:Key="pin">M20.5,15L11.5,15C10.396,15 9.5,15.896 9.5,17 9.5,18.104 10.396,19 11.5,19L20.5,19C21.604,19 22.5,18.104 22.5,17 22.5,15.896 21.604,15 20.5,15z M13.583,8L12.5,14 19.5,14 18.416,8 13.583,8z M16,29L17.5,20 14.5,20 16,29z M13,7L19,7C19.828,7 20.5,6.328 20.5,5.5 20.5,4.672 19.828,4 19,4L13,4C12.171,4 11.5,4.672 11.5,5.5 11.5,6.328 12.171,7 13,7z</Geometry> 
    <Geometry ... 
</ResourceDictionary> 

我能够载入字典,而无需使用任何问题:

var rd = Application.LoadComponent(new Uri(path, UriKind.Relative)) as ResourceDictionary; 

当我检查字典项的值,我得到不同的结果我的电脑是否使用英语或法语文化。

当我的电脑用的是英语,这个值是:

M20.5,15L11.5,15C10.396,15 9.5,1... 

但如果我的PC使用法语,值是:

M20,5;15L11,5;15C10,396;15 9,5;1... 

,然后当我尝试使用Geometry.Parse,它断言由于字符串不使用标准几何命名法。

foreach (DictionaryEntry entry in dictionary) 
{ 
    var Data = Geometry.Parse(entry.Value.ToString()); <--- ASSERTS HERE 
    ... 

而不是Application.LoadComponent,我尝试使用XamlReader来解析嵌入式词典:

var info = Application.GetResourceStream(new Uri(path, UriKind.Relative)); 
var context = new ParserContext() { XmlLang = "en-US" }; 
var reader = new XamlReader(); 
var rd = reader.LoadAsync(info.Stream, context) as ResourceDictionary; 

我最终有我的字典项内相同的结果。字符仍然被转换。这就像parsercontext被忽略。


我试图迫使语言在资源字典的根与XML:LANG =“EN-US”,我试图迫使其几何里面的物品。我无法收到未更改的字符串。角色最终取代。


结论:我唯一能做的就是取代';'与','和','与'。'。但这只适用于法国文化。这不是我正在寻找的解决方案。

任何人都可以帮助我理解如何正确加载我的资源,而不会受到文化欺负吗?

回答

1

这看起来像是Geometry中的一个错误; ParseToString应该是对称的。

作为一种变通方法,可以转化资源的字符串时使用固定区域性:

foreach (DictionaryEntry entry in dictionary) 
{ 
    string valueAsString = ((Geometry)entry.Value).ToString(CultureInfo.InvariantCulture); 
    var Data = Geometry.Parse(valueAsString); 
    ... 

话虽这么说,我不知道为什么你需要做ToStringParse ...能你是不是把资源投给了Geometry

foreach (DictionaryEntry entry in dictionary) 
{ 
    var Data = (Geometry)entry.Data; 
    ... 

我报告的问题on Connect,但我怀疑这将永远是固定的...

+0

你让我很快乐。我不知道在保留当前文化的同时将字符串转换为几何图形。非常感谢! – BriocheBro

+1

@BriocheBro你不能将一个字符串转换成一个'Geometry',但是资源中的对象不是一个字符串,它已经是'Geometry'的一个实例。 –