WPF 的 BBCode 解析器
WPF 的可自定义 BBCode 解析器
引言
本文介绍了一个自定义的 WPF 控件,它允许你在 XAML 应用程序中定义和使用 BBCode
。
背景
我当时正尝试为基本的 CMS 操作创建一个 Silverlight 页面的 ASP.NET 后台。由于 XAML/XML 没有某种代码补全功能很难编辑,所以我决定尝试一下 BBCode
,因为它简单而且方括号对用户来说看起来更好。:)
解析器设计

该控件的设计相当简单。它有一个 BBCode
依赖属性,用于存储当前显示的 BBCode
,一个用于解析期间使用的标签集合,一个用于没有标签的元素的 DefaultElementName
,以及一个用作解析后的 XAML 输出根元素的 RootElementName
。
Parse
方法利用标签将 BBCode
转换为 XAML,然后使用 XamlReader.Load
方法设置 Parser
控件的 UserControl.Content
属性。
标签对象说明
简单标签
: [;)]EnclosingTag
: [i]文本[/i]ValueTag
: [url]http://m0sa.net[/url]ParameterValueTag
: [url=http://m0sa.net]m0sa.net[/url]ParametrizedTag
: [img width=100 height=200]image.jpg[/img]
如果你愿意,可以添加自己的标签。只需实现 ITag
接口,就可以在代码或 XAML 中在 Parser.Tags
中使用它!
Using the Code
以下是如何为 Parser
控件定义自定义 BBCode
的示例

这是演示应用程序:

由于 BBCode
和 Tags
都是依赖属性,因此可以在它们上使用绑定。在演示应用程序中,我将 Textbox.Text
绑定到 Parser.BBCode
属性。这样就有一个(非常)简单的编辑器!
值得关注的点
我第一次尝试编写此控件时使用的是正则表达式,但我决定手动编写解析器,因为我遇到了嵌套 BBCode
的问题。
在使用 XamlReader.Parse(string)
方法时,我遇到了斯洛文尼亚语特殊字符(š、c、ž)的问题。我不得不使用...
XamlReader.Load(new MemoryStream(Encoding.UTF8.GetBytes(xaml)), pc);
...才能使其正常工作。看来 Parse
方法使用 Encoding.ASCII
从输入字符串获取字节。
历史
- 2008-11-27:首次发布