首页 > 解决方案 > Unicode 保留为纯文本,而不是显示为图标

问题描述

我正在创建一个 C# WPF 应用程序,在其中我以编程方式为存储在 SQLite 数据库中的每个类别创建按钮。每个按钮都包含一个 Font Awesome 图标和文本。

桌子

在此处输入图像描述

创建按钮

public static void LoadSidePanelButtons(StackPanel stackPanel)
    {
        DataTable NavigationTable = new DataTable();
        string query = "SELECT * FROM Navigation ORDER BY Name ASC";

        DatabaseConnection.PopulateDataTable(NavigationTable, query);

        foreach (DataRow row in NavigationTable.Rows)
        {
            ToggleButton toggleButton = new ToggleButton();
            toggleButton.Name = "id" + row["navigationID"].ToString();
            toggleButton.Content = row["Name"].ToString();
            toggleButton.Tag = row["Icon"].ToString();
            toggleButton.Style = (Style)stackPanel.Resources["SidePanelButton"];
            toggleButton.Click += new RoutedEventHandler(MainWindow.sidePanelButton_onClick);

            stackPanel.RegisterName(toggleButton.Name, toggleButton);
            stackPanel.Children.Add(toggleButton);
        }
    }

按钮模板

<StackPanel.Resources>
<Style x:Key="SidePanelButton" TargetType="ToggleButton">
    <Setter Property="Height" Value="50" />
    <Setter Property="Width" Value="230" />
    <Setter Property="Margin" Value="0 0 0 10" />

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToggleButton">
                <Border x:Name="Border" CornerRadius="3" Background="Transparent">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="60" />
                            <ColumnDefinition Width="170" />
                        </Grid.ColumnDefinitions>

                        <Grid.RowDefinitions>
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>

                        <TextBlock x:Name="Icon" Grid.Column="0" Grid.Row="0" FontSize="18" Foreground="#FF8B939C" FontFamily="{StaticResource FontAwesomeRegular}" HorizontalAlignment="Center" VerticalAlignment="Center">
                                                    <ContentPresenter x:Name="IconContent" Content="{TemplateBinding Tag}" />
                        </TextBlock>

                        <TextBlock x:Name="Title" Grid.Column="1" Grid.Row="0" FontSize="14" Foreground="#FF8B939C" FontFamily="{StaticResource Roboto}" HorizontalAlignment="Left" VerticalAlignment="Center">
                                                    <ContentPresenter x:Name="TitleContent" Content="{TemplateBinding Content}" />
                        </TextBlock>
                    </Grid>
                </Border>

                <ControlTemplate.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Background" TargetName="Border" Value="#FF19BDD2" />
                        <Setter Property="Foreground" TargetName="Icon" Value="#FFFFFF" />
                        <Setter Property="Foreground" TargetName="Title" Value="#FFFFFF" />
                        <Setter TargetName="spbtBorder" Property="Border.Effect">
                            <Setter.Value>
                                <DropShadowEffect BlurRadius="14" Color="Black" Opacity="0.25" ShadowDepth="4" Direction="-90" />
                            </Setter.Value>
                        </Setter>
                    </Trigger>

                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" TargetName="Border" Value="#FF19BDD2" />
                        <Setter Property="Foreground" TargetName="Icon" Value="#FFFFFF" />
                        <Setter Property="Foreground" TargetName="Title" Value="#FFFFFF" />
                        <Setter TargetName="Border" Property="Border.Effect">
                            <Setter.Value>
                                <DropShadowEffect BlurRadius="14" Color="Black" Opacity="0.25" ShadowDepth="4" Direction="-90" />
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
</StackPanel.Resources>

问题是:

toggleButton.Tag = row["Icon"].ToString();

当我使用它来添加图标时,按钮将“\uf022”显示为纯文本。

但...

toggleButton.Tag = "\uf022";

当我将其更改为此时,它会毫无问题地显示图标。

而且我目前找不到从数据库加载到字符串的 unicode 仍然是纯文本但手动创建的带有 unicode 的字符串显示为图标的原因。

标签: c#wpfunicodefont-awesome

解决方案


正如@RandRambo 在问题下方的评论中指出的那样,问题在于该字符串实际上是"\\uf022"而不是"\uf022".

他的解决方案Regex.Unescape(row["Icon"].ToString());就像一个魅力。


推荐阅读