Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字体转换为字符串并再次转换_C#_Winforms_String_Fonts_Colors - Fatal编程技术网

C# 将字体转换为字符串并再次转换

C# 将字体转换为字符串并再次转换,c#,winforms,string,fonts,colors,C#,Winforms,String,Fonts,Colors,我有一个应用程序,其中我的用户更改不同标签的字体和字体颜色等,他们将其保存到文件中,但我需要能够将指定标签的字体转换为要写入文件的字符串,然后当他们打开该文件时,我的程序将该字符串转换回字体对象。如何做到这一点?我找不到任何地方能说明这是怎么做到的 多谢各位 bael首先,您可以使用下面的文章来列举系统字体 public void FillFontComboBox(ComboBox comboBoxFonts) { // Enumerate the current set of syst

我有一个应用程序,其中我的用户更改不同标签的字体和字体颜色等,他们将其保存到文件中,但我需要能够将指定标签的字体转换为要写入文件的字符串,然后当他们打开该文件时,我的程序将该字符串转换回字体对象。如何做到这一点?我找不到任何地方能说明这是怎么做到的

多谢各位


bael

首先,您可以使用下面的文章来列举系统字体

public void FillFontComboBox(ComboBox comboBoxFonts)
{
    // Enumerate the current set of system fonts,
    // and fill the combo box with the names of the fonts.
    foreach (FontFamily fontFamily in Fonts.SystemFontFamilies)
    {
        // FontFamily.Source contains the font family name.
        comboBoxFonts.Items.Add(fontFamily.Source);
    }

    comboBoxFonts.SelectedIndex = 0;
}
要创建字体,请执行以下操作:

Font font = new Font( STRING, 6F, FontStyle.Bold );
使用它来设置字体样式等

Label label = new Label();
. . .
label.Font = new Font( label.Font, FontStyle.Bold );
您可以将字体类添加到文件中

有关如何执行此操作的详细信息,请参阅

要序列化:

private void SerializeFont(Font fn, string FileName)
{
  using(Stream TestFileStream = File.Create(FileName))
  {
    BinaryFormatter serializer = new BinaryFormatter();
    serializer.Serialize(TestFileStream, fn);
    TestFileStream.Close();
  }
}
private Font DeSerializeFont(string FileName)
{
    if (File.Exists(FileName))
    {
        using(Stream TestFileStream = File.OpenRead(FileName))
        {
            BinaryFormatter deserializer = new BinaryFormatter();
            Font fn = (Font)deserializer.Deserialize(TestFileStream);
            TestFileStream.Close();
        }
        return fn;
    }
    return null;
}
以及反序列化:

private void SerializeFont(Font fn, string FileName)
{
  using(Stream TestFileStream = File.Create(FileName))
  {
    BinaryFormatter serializer = new BinaryFormatter();
    serializer.Serialize(TestFileStream, fn);
    TestFileStream.Close();
  }
}
private Font DeSerializeFont(string FileName)
{
    if (File.Exists(FileName))
    {
        using(Stream TestFileStream = File.OpenRead(FileName))
        {
            BinaryFormatter deserializer = new BinaryFormatter();
            Font fn = (Font)deserializer.Deserialize(TestFileStream);
            TestFileStream.Close();
        }
        return fn;
    }
    return null;
}

使用此代码根据名称和颜色信息创建字体:

Font myFont = new System.Drawing.Font(<yourfontname>, 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
Color myColor = System.Drawing.Color.FromArgb(<yourcolor>);
Font myFont=new System.Drawing.Font(,9.75F,System.Drawing.FontStyle.Regular,System.Drawing.GraphicsUnit.Point,((字节)(0));
Color myColor=System.Drawing.Color.FromArgb();

如果要使文件可读,非常简单:

class Program
{
    static void Main(string[] args)
    {
        Label someLabel = new Label();
        someLabel.Font = new Font("Arial", 12, FontStyle.Bold | FontStyle.Strikeout | FontStyle.Italic);

        var fontString = FontToString(someLabel.Font);
        Console.WriteLine(fontString);
        File.WriteAllText(@"D:\test.txt", fontString);

        var loadedFontString = File.ReadAllText(@"D:\test.txt");

        var font = StringToFont(loadedFontString);
        Console.WriteLine(font.ToString());

        Console.ReadKey();
    }

    public static string FontToString(Font font)
    {
        return font.FontFamily.Name + ":" + font.Size + ":" + (int)font.Style;
    }

    public static Font StringToFont(string font)
    {
        string[] parts = font.Split(':');
        if (parts.Length != 3)
            throw new ArgumentException("Not a valid font string", "font");

        Font loadedFont = new Font(parts[0], float.Parse(parts[1]), (FontStyle)int.Parse(parts[2]));
        return loadedFont;
    }
}

否则,序列化就是一种方法。

很容易从字体到字符串来回切换,然后使用System.Drawing.FontConverter类来回切换。例如:

        var cvt = new FontConverter();
        string s = cvt.ConvertToString(this.Font);
        Font f = cvt.ConvertFromString(s) as Font;

如中所示,您想将.ttf文件存储在您的文件?ttf?我的意思是,我只需要将字体信息(例如:Arial、12.0、常规、绿色)转换为文件。然后,当我将该文件加载到字符串中时,只需将其转换为字体对象+1,这可能是序列化整个对象最优雅的解决方案。请注意,您不必使用BinaryFormatter直接序列化到文件,您可以使用任何IFormatter和任何流。我不会麻烦滚动我自己的序列化程序,因为Font类已经是[serializable]了。根据它所说,通过调用GetConverter方法通过TypeDescriptor类访问FontConverter类。这有什么区别吗?我想不出有什么区别,只是读取Font类上的[TypeConverter]属性并获得完全相同的转换器还有很长的路要走。这个属性永远不会改变,永远不会有+/-1%的好答案。但是,最好使用
ConvertToInvariantString
ConvertFromInvariantString
。否则,字符串格式在不同的国家看起来是不同的,即美国的
Tahoma,10.5pt
Tahoma;在大多数欧洲国家,10,5pt