用数据绑定在TextBlock中查看图标

时间:2015-02-21 22:29:01

标签: c# xaml windows-8.1

我正在尝试制作一个带有图标的网格。我将图标的字符串表示存储在数据库中,并尝试通过绑定到我的viewmodel上的Icon属性(字符串)在GridHub中显示这些图标。

当我使用这个xaml时,我得到了网格中显示的实际文本

<TextBlock Text="{Binding Icon}"
    FontFamily="Segoe UI Symbol"
    FontSize="100"
    TextAlignment="Center"
    VerticalAlignment="Top"
    Foreground="DarkGray"
    AutomationProperties.Name="Some Label"/>

但是这会按预期显示图标

<TextBlock Text="&#xE1D4;"
    FontFamily="Segoe UI Symbol"
    FontSize="100"
    TextAlignment="Center"
    VerticalAlignment="Top"
    Foreground="DarkGray"
    AutomationProperties.Name="Some Label"/>

我的模型看起来像:

 public class PermissionGroup
{
    /// <summary>
    /// The unique identifier for the group.
    /// </summary>
    public string PermissionGroupId { get; set; }
    /// <summary>
    /// The name of the group
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// The page associated with the permission group
    /// </summary>
    public string PageName { get; set; }

    /// <summary>
    /// The icon that will be shown on the PermissionHub page
    /// </summary>
    public string Icon { get; set; }

    /// <summary>
    /// A description of the permissions in the group
    /// </summary>
    public string Description { get; set; }

    /// <summary>
    /// The permissions associated with this permission group
    /// </summary>
    public List<Permission> Permissions { get; set; } 
}

我的viewmodel只包含这些对象的列表。

在我的数据库中,我尝试存储以下内容:

  1. &#xE1D4;
  2. \ uE1D4(必须转义才能进入数据库)
  3. 57812(char.Parse("\uE1D4"))的结果
  4. 并且这些都没有导致图标正确显示!

    The output of first XAML example

1 个答案:

答案 0 :(得分:6)

您必须解码html编码的字符串。例如,您可以尝试这个非常粗略的例子:

public class ViewModel
    {
        public PermissionGroup PG {get; set;}
        public ViewModel()
        {
            PG = new PermissionGroup();
            PG.Icon= System.Net.WebUtility.HtmlDecode("&#xE1D4;");
        }
    }




public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            this.DataContext = new ViewModel();
        }
    }


<TextBlock Text="{Binding Path=PG.Icon}" FontFamily="Segoe UI Symbol"/>

<Style x:Key="Segoe">
    <Setter x:Name="Segoe" Property="TextElement.FontFamily" Value="Resources/#Segoe UI Symbol" />
</Style>

<TextBlock Text="{Binding PG.Icon}"
            Style="{DynamicResource Segoe}"

如果您需要字体查看器here,则可以使用字体查看器。

编辑:无论如何,unicode转义序列应该比html编码更好,这就是为什么我建议用字体查看器仔细检查并将字体ttf作为资源链接。 您还可以添加一个按钮来分析xaml文本的unicode转换,直接输入时不进行绑定。像这样的东西

private void Button_Click(object sender, RoutedEventArgs e)
{
    byte[] stringBytes = Encoding.Unicode.GetBytes(txname.Text);
    char[] stringChars = Encoding.Unicode.GetChars(stringBytes);
    StringBuilder builder = new StringBuilder();
    Array.ForEach<char>(stringChars, c => builder.AppendFormat("\\u{0:X}", (int)c));
    Debug.WriteLine(builder);
}