我在项目的资源文件中嵌入了ResourceDictionary。这本词典包含一堆几何。
<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...
但如果我的电脑使用法语,则值为:
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
...
我尝试使用XamlReader来解析嵌入式字典,而不是 Application.LoadComponent :
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”在ResourceDictionary的根目录强制语言,我尝试在几何项目中强制它。我无法收到未经改动的字符串。字符最终被替换。
结论:我唯一可以做的就是替换';'用','和','用'。'但这只适用于法国文化。这不是我要找的解决方案。
有人能帮助我理解如何正确加载我的资源而不受文化欺凌吗?
答案 0 :(得分:1)
这看起来像Geometry
中的错误; Parse
和ToString
应该是对称的。
作为一种变通方法,您可以在将资源转换为字符串时使用不变文化:
foreach (DictionaryEntry entry in dictionary)
{
string valueAsString = ((Geometry)entry.Value).ToString(CultureInfo.InvariantCulture);
var Data = Geometry.Parse(valueAsString);
...
话虽如此,我不确定您为什么需要ToString
和Parse
...您是否只能将资源投放到Geometry
?
foreach (DictionaryEntry entry in dictionary)
{
var Data = (Geometry)entry.Data;
...
我报告了问题on Connect,但我怀疑它是否会被修复......