编辑:
下面是我的XML的格式。它包含我的Iconsheet的数据。我只为样本放置一个图标十六进制值。
<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);
}
}
在上述数据[ItemCount]中。值包含数据为" UE101"。这不起作用。
下面的代码工作。
Text = "uE101"
任何帮助将不胜感激。
更新:
在 HAR07 和 mishan 评论的帮助下,我现在对如何处理C#中的十六进制代码有一个清晰的剪切想法。谢谢您的帮助。但是我更新了我正在尝试的问题,这就是导致我问题的原因。
在这种情况下,您不能将后斜线与下一个字符分开。此代码:
@"" + "uE101"
等于:
"\uE101"
将输出此字符串而不是特殊字符:
uE101
他们需要写为单字符串表达式:
"uE101"
更新:
您可以通过在XML(<Value>E101</Value>
)中仅存储字符的十六进制部分来使用 @Mishan的第二个解决方案,然后将其解析为int->> contry int to char->将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#编写XML文档,并使用特定的编码"来找到许多示例。
好吧, har07 在他的回复中回答了您的问题,所以我将添加一些可能的解决方案。
1.存储整个字符
-
将后斜线添加到数据中 - 然后它将起作用
-
创建数据时,请立即将后斜切添加到它,以便已经完成
2。将字符作为(十六进制)数字存储
或立即将它们存储为字符,这将是最好的选择
- 当您出于某种原因需要组装它们时,您只需从数字转换为字符,瞧。
示例:
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();
仅存储十六进制值,在前面没有" u" 喜欢
E101
,而不是uE101
,然后将它们转换为ints ....//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); } }
结论
IMHO我能想到的最好的解决方案是我的头顶是将XML与后斜线一起存储在值中,并且在阅读时,拥有 ItemInfo
类,名称