当我在 iOS 上需要这样的东西时,我已经实现了非常基本的类似 BBCode 的标记语言,只有几个标签:“[b]”、“[/b]”、“[[”和“]]”(在我的项目我什至不需要斜体,只需要粗体)。
但是,.NET 没有我用来解析语法的 NSScanner 类的模拟。相反,它对解析 XML 数据有更好的支持。因此,在 WP7 上实现一个非常基本的 XML 子集会更容易,只支持 <b> 和 <i> 标签。有关示例代码,请参见本页末尾。
以下是如何将格式化的文本片段添加到 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;
}
}
}