编辑:
以下是我的XML格式。它包含我的IconSheet的数据。我只为样本添加了一个图标Hex Value。
<Item>
<ItemInfo>
<Value>uE101</Value>
<Name>1</Name>
</ItemInfo>
</Item>
以下是我的代码
的摘录private void OnLoaded(object sender, RoutedEventArgs e)
{
data = (from query in XElement.Load("Data.xml").Descendants("ItemInfo")
select new ItemInfo
{
value = (int)(query.Element("Value").Value),
name = (string)query.Element("Name")
}).ToList();
int itemcount = data.length;
while (itemcount-- > 0)
{
TextBlock t = new TextBlock()
{
Width = 75,
Height = 75,
Text = @"\" + data[itemcount].value,
FontFamily = new FontFamily("Segoe UI Symbol")
};
wrapPanel.Children.Add(t);
}
}
Snippet Above数据中的[itemcount] .value包含数据“uE101”。这不起作用。
下面的代码可以使用。
Text = "\uE101"
非常感谢任何帮助。
更新
在 har07 和 mishan 评论的帮助下,我现在明确了解如何在C#中处理HEX代码。谢谢您的帮助。但是我更新了我正在尝试的问题,这就是导致问题的原因。
答案 0 :(得分:3)
在这种情况下,您无法将反斜杠与下一个字符分开。这段代码:
@"\" + "uE101"
等于:
"\\uE101"
将输出此字符串而不是特殊字符:
\uE101
它们需要写成单个字符串表达式:
"\uE101"
更新:
你可以使用@ mishan的第二个解决方案,只在xml(<Value>E101</Value>
)中存储字符的十六进制部分,然后将其解析为int - &gt;将int转换为char - &gt;将char转换回字符串(以下是澄清我的意思的例子):
.....
TextBlock t = new TextBlock()
{
Width = 75,
Height = 75,
Text = ((char)int.Parse(data[itemcount].value, NumberStyles.HexNumber)).ToString(),
FontFamily = new FontFamily("Segoe UI Symbol")
};
.....
或者将精确字符写入xml并将xml编码指定为支持特殊字符的格式。您没有显示创建该xml的代码,因此我无法帮助您接近您的精确样本。但您可以通过关键字“ c#write xml document with specific encoding ”搜索此主题,并会找到许多示例。
答案 1 :(得分:1)
嗯, har07 在回复中回答了您的问题,所以我只想添加一些可能的解决方案。
1.存储整个角色
将反斜杠添加到数据中 - 然后它将起作用
创建数据时,立即为其添加反斜杠,使其已经完成
<强> 2。商店字符为(HEXADECIMAL)编号
或立即将它们存储为角色,这将是最佳选择
实施例
while (itemcount-- > 0)
{
//can be achieved if data[].value is integer
//for testing purposes
//I used integer with value 0xE101
//int a = 0xe101;
TextBlock t = new TextBlock()
{
Width = 75,
Height = 75,
Text = ((char)data[itemcount].value).ToString(),
//Text = ((char)a).Tostring(),
FontFamily = new FontFamily("Segoe UI Symbol")
};
wrapPanel.Children.Add(t);
}
最简单的解决方案是,如果您可以将整个代码保存在xml中。
,我的意思是,如果您可以在\
之前添加反斜杠(uE101
)
<Item>
<ItemInfo>
<Value>\uE101</Value> //see the added "\" character?
<Name>1</Name>
</ItemInfo>
</Item>
和C#代码:
data = (from query in XElement.Load("Data.xml").Descendants("ItemInfo")
select new ItemInfo
{
value = query.Element("Value").Value, //provided value is of string type
name = query.Element("Name").Value
}).ToList();
只存储HEX值,前面没有“u” ,如E101
,而不是uE101
,并将它们转换为整数。 .. 的
//the conversion from STRING CONTAINING HEXADECIMAL CHARACTERS to INTEGER
//can be done by standard methods included in basic interger...
//YOUR'S doesn't work because you didn't remove the `u` in front of the HEX VALUE
//in string - and i'm also not sure about the implicit conversion between
//hexadecimal string and integer....
//so, the improved version of your code using the stuff you have now
private void OnLoaded(object sender, RoutedEventArgs e)
{
//this should work for values stored as integer
data = (from query in XElement.Load("Data.xml").Descendants("ItemInfo")
select new ItemInfo
{
value = int.Parse(query.Element("Value").Value.ToString().Substring(1),NumberStyles.HexNumber),
name = query.Element("Name").Value
}).ToList();
int itemcount = data.length;
while (itemcount-- > 0)
{
TextBlock t = new TextBlock()
{
Width = 75,
Height = 75,
Text = @"\" + data[itemcount].value,
FontFamily = new FontFamily("Segoe UI Symbol")
};
wrapPanel.Children.Add(t);
}
}
恕我直言,我能想到的最好的解决方案是在值中存储带反斜杠的XML,在阅读时,让 ItemInfo
类包含两个字符串 - 值和名称