本地化资源中的文本样式

时间:2012-11-26 06:58:14

标签: c# windows-phone-7 localization text-styling

我在windows-phone上有一个关于本地化资源的问题。

假设我的资源文件中有一个字符串,它应该如下所示:

  

这是一些文字。 此值为粗体。 这个是斜体。

并且全部存储在单个字符串字段中。我怎么能在参考资料本身中定义像粗体或斜体这样的文本样式?我知道,我可以预定义一些自定义字体,如下所示:

<FontFamily x:Key="CustomBold">...</FontFamily>

然后在页面中添加为{StaticResource CustomBold},但如果字符串字段中的整个文本为粗体,则可以是解决方案。如果我想在短语的中间加粗一个单词怎么办?


我想使用原生的c#样式资源(即字符串名称 - >字符串值),而不是编写不同的实现。

2 个答案:

答案 0 :(得分:3)

当我在iOS上需要这样的东西时,我已经实现了非常基本的BBCode-alike标记语言,只有几个标记:“[b]”,“[/ b]”,“[[”和“ ]]“(在我的项目中,我甚至不需要斜体,只有粗体)。

但是,.NET没有我用来解析语法的NSScanner类的模拟。相反,它对解析XML数据有更好的支持。因此,在WP7上,只需&lt; b&gt;就可以更轻松地实现XML的基本子集。和&lt; i&gt;标签支持。有关示例代码,请参阅this page的末尾。

Here's how to add formatted text pieces into the WP7 TextBlock.

更新:好的,这是完整的解决方案:

[Flags]
enum eParseState: byte
{
    bold = 1,
    italic = 2,
}

// Sample input: "<txt>This is <i>some</i> text. <b>This value is <i>bold</i>.</b> This one is not.</txt>"
static void parseRichText( TextBlock tb, string xml )
{
    tb.Inlines.Clear();
    XmlReader reader = XmlReader.Create( new StringReader( xml ), new XmlReaderSettings() { ConformanceLevel=ConformanceLevel.Fragment } );
    eParseState state = 0;

    var names = new Dictionary<string, eParseState>()
    {
        { "b", eParseState.bold },
        { "i", eParseState.italic },
    };

    Action<bool> actElement = ( bool isOpening ) =>
    {
        string name = reader.Name.ToLower();
        eParseState flag;
        if( !names.TryGetValue( name, out flag ) ) return;
        if( isOpening )
            state |= flag;
        else
            state &= ( ~flag );
    };

    while( reader.Read() )
    {
        switch( reader.NodeType )
        {
            case XmlNodeType.Element:
                actElement( true );
                break;
            case XmlNodeType.EndElement:
                actElement( false );
                break;
            case XmlNodeType.Text:
                var run = new Run() { Text = reader.Value };
                if( 0 != ( state & eParseState.bold ) ) run.FontWeight = FontWeights.Bold;
                if( 0 != ( state & eParseState.italic ) ) run.FontStyle = FontStyles.Italic;
                tb.Inlines.Add( run );
                break;
        }
    }
}

答案 1 :(得分:0)

嗯...

我找到了解决方案,但看起来很笨拙。

应该使用的控件是 RichTextBox

在Windows Phone中,RichTextBox与原生.Net

的工作方式略有不同

要为部分文本设置不同的样式,我们必须划分单个字符串:

所以,让我们想象一下,我们在Resources中有一个字符串字段:

  

这是一些文字。 此值为粗体。这个不是。

将它分成三个字符串(是的,这真的很笨拙):

  1. 这是一些文字。
  2. 此值为粗体
  3. 这个不是。
  4. 然后,在代码中我们使用RichTextBox rtb

                Paragraph paragraph = new Paragraph();
                Bold bold = new Bold();
                bold.Inlines.Add(new Run() { Text = _string2FromResources });
    
                Run run = new Run();
                run.Text = _string1FromResources;
                Run run2 = new Run();
                run2.Text = _string3FromResources;
    
                paragraph.Inlines.Add(run); 
                paragraph.Inlines.Add(bold);
                paragraph.Inlines.Add(run2);
    
                rtb.Blocks.Add(paragraph);
    

    那真的有用。但实施的质量......嗯,你明白了。所以我真的很感激,如果有人可以添加一个更好的解决方案的例子。