将字符串转换为字体&颜色

时间:2009-10-05 04:49:34

标签: c# regex winforms fonts

有人可以帮我一个正则表达式(或其他东西),我真的很难完成这项任务,并且无法找到任何可以帮助我完成任务的地方。

我有一个程序,用户在表单上放置一些控件。当他们点击保存按钮时,它会浏览表单上的所有控件并将其详细信息保存到文本文件中(我知道该怎么做)..就像这样:

Label
"This is text on a label"
20, 97
Tahoma, 7.5, Regular
-778225617

说明:

Control Type
Text property of that control
Location of the control
Font properties for that control
ForeColor for that control.

... 用户保存时创建的此文本文件可能只包含单个控件的信息,如上所示,甚至包含多个控件,如下所示:

Label
"This is text on a label"
20, 97
Tahoma, 7.5, Regular
-778225617
LinkLabel
"This text belongs to the linklabel text property."
Arial, 20, Bold
-119045893

说明:

Control
Text Property
Location
Font Properties
ForeColor
Control
Text Property
Location
Font Properties
ForeColor

...等......我发现这对我来说很难,因为到目前为止我还不是专家。有人能帮帮我吗?我还需要将字体属性行从字符串转换为Font对象,以便在运行时将其分配给指定控件的Font属性。

我真的很感激任何帮助。非常感谢你。

由于 松鸦

6 个答案:

答案 0 :(得分:3)

你会做这样的事情:

using System;
using System.Drawing;

class Example
{
    static void Main()
    {
        String fontName = "Tahoma, Regular, Size";
        String[] fontNameFields = fontName.Split(',');

        Font font = new Font(fontNameFields[0],
            Single.Parse(fontNameFields[2]),
            (FontStyle)Enum.Parse(typeof(FontStyle), fontNameFields[1]));
    }
}

答案 1 :(得分:1)

您可以从文件中读取文本并将字符串拆分为数组,然后使用字体类的重载构造函数创建新的字体对象。

有关字体构造函数的列表,请参阅

Font Constructor

尺寸参数是新字体的的em尺寸。因此,对于其他单位的字体大小,你必须要处理它。

答案 2 :(得分:1)

这似乎是一个说得不好的问题......我看到它有几个漏洞。 (我假设你在谈论WinForms)我稍后会解决这些问题。

我不知道.NET中的任何功能都将为您完成所有这些组合解析。但是,您可以使用CSSName属性[它是一个接近此属性的属性]使用WinForms进行格式调整,并在GUI上使用CSS文件。 [有点奇怪,但它有效]

Btw表示负整数是一个有符号整数,表示以下颜色集:  RGB:

255 255 255

的问题:

  1. 字体和格式的数据规范似乎表明没有控件可以嵌入另一个控件,这通常是使用WinForms的按钮,标签和面板完成的。 (XML将是嵌入和避免此问题的一个很好的建议)
  2. 这不是标准格式。为什么不选择RTF。使用RTF看起来很简单,你可以让观众随之而去。
  3. 属性定义和值分离。看起来您使用的是属性表格式,并不意味着属性与您建议的内容对齐,因此很容易解析。

答案 3 :(得分:1)

为什么你没有使用XmlSerialization。你只需要创建一个内存流,然后调用它的点Save方法;然后你可以随时重新加载数据。

例如,你有一个名为Canvas的类。

继续使用Canvas.AddControls(controlTypes.Label,“这是标签上的文字”, 20,97,Tahoma,7.5,Regular,-778225617);

请参阅simplest XmlSerializer示例。

如果您不希望您的文件是xml类型的?使用二进制序列化。 See this

类似的东西:

public static void Save(object obj)
{
    using (System.IO.MemoryStream stream = new System.IO.MemoryStream())
    {
        // Serialize an object into the storage referenced by 'stream' object.
        System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();

        // Serialize multiple objects into the stream
        formatter.Serialize(stream, obj);

        // If you want to put the stream into Array of byte use below code
        // byte[] buffer = stream.ToArray();
    }
}

答案 4 :(得分:0)

10分钟解决方案:

好的,以下是5分钟的“快速努力”,我真正的意思;我希望这能解决问题。

  • 第1步:获取画布 - 画布对象
  • 第2步:向其添加图纸/控件
  • 步骤3:序列化,保存和重新加载对象

见下文。

第1步:画布类

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;

namespace SaveControls
{
    [Serializable()]
    public class CCanvas
    {

        List<CDrawing> _listControls;
    public List<CDrawing> Controls
    {
        get { return _listControls; }
    }

    public CCanvas()
    {
        _listControls = new List<CDrawing>();
    }

    public void AddControls(CDrawing theControls)
    {
        _listControls.Add(theControls);
    }

    public void ReloadControl(Form frm)
    {
        //foreach (CDrawing draw in _listControls) -- requires IEnumerable implementation.
        for (int i = 0; i < _listControls.Count; i++)
        {
            CDrawing d = (CDrawing)_listControls[i];
            d.Draw(frm);
        }
    }


    public void Save()
    {
        try
        {
            using (Stream stream = File.Open("data.bin", FileMode.Create))
            {
                BinaryFormatter bin = new BinaryFormatter();
                bin.Serialize(stream, this);
            }
        }
        catch (IOException)
        {
        }

    }

    public CCanvas Open()
    {
        CCanvas LoadedObj = null;
        using (Stream stream = File.Open("data.bin", FileMode.Open))
        {
            BinaryFormatter bin = new BinaryFormatter();

            LoadedObj = (CCanvas)bin.Deserialize(stream);

        }
        return LoadedObj;
    }
}

}

第2步:添加图纸

using System;
using System.Collections.Generic;
using System.Text;
using System;
using System.Data;

using System.Collections.Generic;
using System.Collections;
using System.IO;
using System.Xml.Serialization;
using System.Windows.Forms;
using System.Drawing;

namespace SaveControls
{
    [Serializable()]
    public class CDrawing
    {
        public enum ControlTypes { Label, TextBox, None };

        private ControlTypes _controlType;
    public ControlTypes ControlType
    { get { return _controlType; } }

    private string _strControlText;
    public string Text
    { get { return _strControlText; } }

    private int _xPosition;
    public int X
    { get { return _xPosition; } }

    private int _yPosition;
    public int Y
    { get { return _yPosition; } }


    private string _strFontName;
    public string Font
    { get { return _strFontName; } }

    double _fFontSize;
    public double Size
    { get { return _fFontSize; } }

    string _strStyle;
    public string Style
    { get { return _strStyle; } }

    decimal _dForegroundColor;
    public decimal Color
    { get { return _dForegroundColor; } }

    public CDrawing(ControlTypes controlType, string strControlText, int xPosition, int yPosition,
    string strFontName, double fFontSize, string strStyle, decimal dForegroundColor)
    {
        _controlType = controlType;
        _strControlText = strControlText;
        _xPosition = xPosition;
        _yPosition = yPosition;
        _strFontName = strFontName;
        _fFontSize = fFontSize;
        _strStyle = strStyle;
        _dForegroundColor = dForegroundColor;


    }

    public void Draw(Form frm)
    {
        if (_controlType == ControlTypes.Label)
        {
            Label lbl = new Label();

            lbl.Text = _strControlText;
            lbl.Location = new Point(_xPosition, _yPosition);

            System.Drawing.FontStyle fs = (_strStyle == System.Drawing.FontStyle.Regular.ToString()) ? System.Drawing.FontStyle.Regular : System.Drawing.FontStyle.Bold;

            lbl.Font = new System.Drawing.Font(_strFontName, (float)_fFontSize, fs);
            lbl.ForeColor = SystemColors.Control;// _dForegroundColor;
            lbl.Visible = true;
            frm.Controls.Add(lbl);
        }
    }


}

}

第3步:使用,序列化,保存,重新加载

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


    public void Save()
    {
        //Create a canvas object
        CCanvas Canvas1 = new CCanvas();

        //Add controls
        Canvas1.AddControls(new CDrawing(CDrawing.ControlTypes.Label, "This is text on a label1", 10, 100, "Tahoma", 7.5, "Regular", -778225617));
        Canvas1.AddControls(new CDrawing(CDrawing.ControlTypes.Label, "This is text on a label11", 20, 200, "Verdana", 7.5, "Regular", -778225617));
        Canvas1.AddControls(new CDrawing(CDrawing.ControlTypes.Label, "This is text on a label111", 30, 300, "Times New Roman", 7.5, "Regular", -778225617));

        //Save the object
        Canvas1.Save();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Save();

    }

    private void btnLoad_Click(object sender, EventArgs e)
    {
        Load();

    }

    public void Load()
    {
        //Retrieve
        CCanvas Canvas2 = new CCanvas();

        //opens the binary file
        Canvas2 = Canvas2.Open();

        //loads control to this form.
        Canvas2.ReloadControl(this);


    }

}

如果您打算讨厌此解决方案,请告诉我们原因。同时我正在寻找上传的地方。 Googlecode,但我没有安装subversion客户端。 :0(

答案 5 :(得分:-1)

这对你有用吗?

Font font = new Font("Tahoma",12,FontStyle.Regular);