C# - 如何在字符串资源中使用斜体字

时间:2017-11-15 12:16:26

标签: c# wpf resources

我正在编写一个WPF应用程序,我需要在我的视图中对描述中的单词进行斜体显示,同时仍然将它们放在资源中,以便稍后提供多语言支持。这些描述是资源化的,并通过一个导向器,通过他们的代码将视图模型中的描述与其相应的位置相匹配。

我尝试过:

我已开始单独为重要词语提供资源,并在描述资源中添加占位符代码。然后,当我们通过导演时,我想在描述字符串中插入重要的单词,但是我可以在这个阶段对它们进行斜体处理,因为它们只是字符串!我该怎么做呢?

3 个答案:

答案 0 :(得分:2)

这通常是您将数据与数据视图交织在一起的情况。你应该将它们分开,Model-View-Controller (MVC)建议。

您有一些数据由两部分组成:

  • 您的描述
  • 您的描述中需要强调的文字

此数据可以通过多种方式显示。一种方法 - 您想要的方法 - 是显示完整的描述,而需要强调的文本必须以斜体显示。

但是人们也可以想到一种观察方法,其中强调的单词以粗体显示,或者以不同的字体显示,或者以红色显示,或者颠倒显示。

通过将数据与查看数据的方式分开,可以更改此视图而无需更改数据本身

现在回到你的问题。所以你有一些文字和一些需要强调的潜台词。您如何知道需要强调哪些文本超出了您的问题范围。如何将此信息放在此类中也超出了此问题的范围。您所需要的只是一些翻译功能,它将您的文本翻译成一种格式,允许翻译文本的翻译人员知道完整的文本,以及必须强调哪些短语。

如何标记强调的开始位置和停止位置并不重要,只需使用一些明确定义的方法。

例如,您可以使用HTML方法进行强调:

Some normal text <em>is emphasized</em> and normal again

如果需要,您可以使用任何其他方法,例如添加双正斜杠来切换强调打开或关闭,或其他任何方法。只要定义得当,它就无所谓了。

因此,保存文本和强调的类需要一个提取翻译文本的过程

public string ExtractTranslatedText()
{
    // TODO: take your original text and add <em> and </em>
    // to mark begin and end of emphasis
}

您似乎几乎成功创建了此功能。

现在,一旦你有一个包含这个重点的字符串,你需要显示它。这取决于您的显示类如何做到这一点。

假设您想在RichTextBox中以斜体显示它。您可以从RichTextBox派生您的类,或者您可以为RichTextBox创建扩展函数。

请参阅Extension Methods Demystified

public static class RichTestBoxExtensions
{
    // TODO: add the required functions
}

我们需要一个函数,它会将一些文本附加到给定System.Drawing.FontStyle文本框中已存在的文本中:

public static void AppendText(this RichTextBox box, string text, FontStyle fontStyle)
{
    box.SelectionStart = box.TextLength;
    box.SelectionLength = 0;

    Font savedSelectionFont = box.SelectionFont;
    box.SelectionFont = new Font(box.SelectionFont, fontStyle);
    box.AppendText(text);
    box.SelectionFont = savedSelectionFont;
}

如果需要,还可以添加方法以不同颜色显示文本。 代码将非常相似。

现在,您需要将带有重点标记的已翻译字符串放在富文本框中

public static ShowEmphasis(this RichTextBox, string text, FontStyle emphasisStyle)
{
    const string emphasisOn = "<em>";
    const string emphasisOff = "</em>";

    while(!String.IsNullOrEmpty(text))
    {   // still some text to print
        // get the substring until first emphasisOn
        int indexStartEmphasis = text.Index(emphasisOn);

        if (indexStartEmphasis == -1)
        {   // no emphasisOn anymore: write all in emphasisStyle
            richTextBox.AppendText(text, emphasisStyle);
            text = String.Empty; // no text left
        }
        else
        {   // write until emphasisOn:
            string normalText = text.SubString(0, indexStartEmphasis);
            richTextBox.AppendText(normalText, FontStyle.Normal);

            // remove the normalText + <em> from text:
            text = text.Substring(indexStartEmphasis + emphasisOn.Length);

            // do the same until emphasisOff
            int indexStopEmphasis = text.Index(emphasisOff);
            if (indexStopEmphasis == -1)
            {   // no emphasisOff anymore: write all in emphasisStyle
                richTextBox.AppendText(text, FontStyle.Normal);
                text = String.Empty; // no text left
            }
            else
            {   // write until emphasisOff in emphasisStyle:
                string emphasizedText = text.SubString(0, indexStopEmphasis);
                richTextBox.AppendText(emphasizedText, emphasisStyle);

                // remove the emphasizedlText + </em> from text:
                text = text.Substring(indexStopEmphasis + emphasisOff.Length);
            }
        }
    }
}

答案 1 :(得分:0)

如果您的资源将由TextBlock使用,则必须将文本分隔为单独的内联。

例如为: 您要显示的文字是This is an italic, bold and underlinded text。 需要将此字符串拆分为资源文件的单独部分,如下所示:

  • Res1:这是
  • Res2:italic
  • Res3:,
  • Res4:粗体
  • Res5:和
  • Res6:带下划线
  • Res7:text

您的XAML应如下所示:

<TextBlock FontSize="14">
    <Run Text="{x:Static p:Resources.Res1}" />
    <Run Text="{x:Static p:Resources.Res2}" FontStyle="Italic" />
    <Run Text="{x:Static p:Resources.Res3}" />
    <Run Text="{x:Static p:Resources.Res4}" FontWeight="Bold" />
    <Run Text="{x:Static p:Resources.Res5}" />
    <Run Text="{x:Static p:Resources.Res6}" TextDecorations="Underline" />
    <Run Text="{x:Static p:Resources.Res7}" />
</TextBlock>

这导致以下格式:

enter image description here

答案 2 :(得分:-1)

如果你有一个完整的描述,那就是f.e中出现的一个string。一个标签,你只想要这个string斜体的一部分,那么这是不可能的。

如果是label(不确定control提供了哪些说明),您可以为此重要字词创建一个单独的label,并放置此特定label (使用斜体属性设置)您希望它在哪里。