Segoe UI符号 - 以编程方式

时间:2014-01-21 13:18:52

标签: c# windows-phone-8

编辑:

以下是我的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代码。谢谢您的帮助。但是我更新了我正在尝试的问题,这就是导致问题的原因。

2 个答案:

答案 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)编号

或立即将它们存储为角色,这将是最佳选择

  • 当你因某种原因需要组装它们时,你只需要从数字转换为字符,然后瞧.... [/ li>

实施例

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);

    }

我的回答更新

  1. 最简单的解决方案是,如果您可以将整个代码保存在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();
    
  2. 只存储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);
    
        }
    }
    
  3. 结论

    恕我直言,我能想到的最好的解决方案是在值中存储带反斜杠的XML,在阅读时,让 ItemInfo 类包含两个字符串 - 值和名称