我正在编写一个WPF应用程序,我需要在我的视图中对描述中的单词进行斜体显示,同时仍然将它们放在资源中,以便稍后提供多语言支持。这些描述是资源化的,并通过一个导向器,通过他们的代码将视图模型中的描述与其相应的位置相匹配。
我尝试过:
我已开始单独为重要词语提供资源,并在描述资源中添加占位符代码。然后,当我们通过导演时,我想在描述字符串中插入重要的单词,但是我可以在这个阶段对它们进行斜体处理,因为它们只是字符串!我该怎么做呢?
答案 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
。
需要将此字符串拆分为资源文件的单独部分,如下所示:
您的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>
这导致以下格式:
答案 2 :(得分:-1)
如果你有一个完整的描述,那就是f.e中出现的一个string
。一个标签,你只想要这个string
斜体的一部分,那么这是不可能的。
如果是label
(不确定control
提供了哪些说明),您可以为此重要字词创建一个单独的label
,并放置此特定label
(使用斜体属性设置)您希望它在哪里。