jcwx 发表于 2013-6-18 14:21:40

【转】自制一个简单的标签云TagCloud控件(Winform)

转自CSDN:


标签云(TagCloud)是一种通过按照热门程度确定字体的大小和颜色来表示内容的信息标签集合,是一套相关的标签以及与此相应的权重。典型的标签云有30至150个标签。权影响使用的字体大小或其他视觉效果。
典型的标签云就像这样
http://img.bbs.csdn.net/upload/201306/17/1371481640_702914.gif
作为非专业人士,在WinForm中实现标签云,需要首先分析它的行为和现象:
1.文字大小由权值决定
2.文字颜色由权值决定
3.文字流式布局
4.文字可点击
现在动手开始做控件。
先检查需要的命名空间using System.Windows.Forms;
using System.Drawing;然后新建一个类,这是个控件,继承自Control类public class TagCloudControl : System.Windows.Forms.Control
{ }先看第3条:文字流式布局
我在很早之前介绍过一个WinForm控件:FlowLayoutPanel,流式布局面板,以前的帖子还在,只是图片随着CSDN升级早已丢失:点击看帖。
如果使用FlowLayoutPanel,很显然上面的第3条就很容易满足,不需要多费心思了,所以,在控件里加上一个FlowLayoutPanel。public class TagCloudControl : System.Windows.Forms.Control
{
    // 流布局面板
    private FlowLayoutPanel flow = null;
    // 初始化流布局面板
    private void InitiateFlow()
    {
      flow = new FlowLayoutPanel();
      flow.AutoScroll = true;
      flow.BackColor = Color.White;
      flow.Padding = new System.Windows.Forms.Padding(5);
      flow.Dock = DockStyle.Fill;
      flow.WrapContents = true;
      this.Controls.Add(flow);
    }
    // 标签云的构造函数flow.Padding = new System.Windows.Forms.Padding(5);
   public TagCloudControl()
    {
      InitiateFlow();
    }
}接下来,对于第1、2条,这个权值,应该是对应着字体大小和颜色的。如果可能,用一个类似字典的查询表存储权值及其对应的颜色(调色板)。但为了简单起见,我把这项工作丢给各位使用者,由你们来决定字体大小和颜色。注意最后的EventHandler参数,通过这个委托,使得可以直接指定标签的点击事件处理程序,这样就可以使每个标签都是可点击的了。public void Add(string tag, float size, Color color, EventHandler action)
{
    if (string.IsNullOrEmpty(tag) == true) return;
    if (size < 6) size = 6;
    // 用普通标签表示一个tag
    Label label = new Label();
    label.AutoSize = true;
    label.Cursor = Cursors.Hand;
    label.ForeColor = color;
    label.Text = tag;
    label.Font = new System.Drawing.Font(label.Font.FontFamily, size);
    if(action != null) label.Click += action;
    flow.Controls.Add(label);
}现在,这个标签云就有了最最最最最基本的功能了:添加并显示。
下面来试试这个做出来的标签云怎么样。
随便找个窗口类,比如Form1,然后在里面添加这些代码:
标签内容就暂时用这些:string[] tags = { "天才", "大傻逼", "平凡的人", "男神", "女神", "女屌丝", "笨蛋", "学生狗" };然后颜色用这几种:Color[] colors = {
                        Color.OrangeRed,
                        Color.DeepSkyBlue,
                        Color.LawnGreen,
                        Color.Violet,
                        Color.MediumSlateBlue
                  };现在,就可以随机添加点标签进去了。在Form1的构造函数中这样写:public Form1()
{
    InitializeComponent();
    Random rand = new Random();
    for (int i = 0; i < 30; i++)
    {
      string tag = tags;
      Color color = colors;
      tagCloud1.Add(
            tag,
            (float)rand.Next(10, 30),
            color,
            delegate(object sender, EventArgs e) { MessageBox.Show("我是一个" + tag); }
            );
    }
}运行这个程序,可以看到标签云已经基本成型了
http://img.bbs.csdn.net/upload/201306/17/1371484061_592779.png

点击某个标签,可以看到每个标签都可以响应各自的事件处理程序。
http://img.bbs.csdn.net/upload/201306/17/1371484103_970525.png
http://img.bbs.csdn.net/upload/201306/17/1371484112_929988.png

So,剩下的就是完善了。比如加上删除、查找等功能,添加调色板,完善事件机制等等等等。自己思考吧。

最后是源代码(.NET 2.0,VS2012,其他版本可以直接导入.csproj使用):点击下载

羽叶 发表于 2013-6-18 14:23:26

请不要纯粹的复制粘贴,编辑好了再发。
可以先粘贴到记事本里 再从记事本里复制。

jcwx 发表于 2013-6-18 14:29:05

你真快啊,我刚发完你就看到了
编辑好了

mwylaoma 发表于 2013-6-18 17:26:31

不错的一个控件,不过可否结合DEV来使用?

hngs 发表于 2013-6-18 20:49:35

有点启发,谢谢!

l0711 发表于 2013-6-19 23:14:55

学习啦,谢谢
页: [1]
查看完整版本: 【转】自制一个简单的标签云TagCloud控件(Winform)