Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 在Visual C中,单词在标签中的位置#_C#_Printing_Position_Label - Fatal编程技术网

C# 在Visual C中,单词在标签中的位置#

C# 在Visual C中,单词在标签中的位置#,c#,printing,position,label,C#,Printing,Position,Label,我使用: 自动包装标签。和使用 label1.MaximumSize = new Size(100,0); label1.AutoSize = true; 打印标签 但现在问题来了:DrawString只将label1.Text作为“纯字符串”。它不包括任何包装。所以我的结果看起来像 e.Graphics.DrawString(label1.Text,new SolidBrush(Color.Black),10,10); 而不是: This is a printing test! 应该是这

我使用:

自动包装标签。和使用

label1.MaximumSize = new Size(100,0);
label1.AutoSize = true;
打印标签

但现在问题来了:DrawString只将label1.Text作为“纯字符串”。它不包括任何包装。所以我的结果看起来像

e.Graphics.DrawString(label1.Text,new SolidBrush(Color.Black),10,10);
而不是:

This is a printing test!
应该是这样的。是否有任何方法可以知道文本的包装位置(在本例中为“打印”之后),以便向其添加
\n
,以获得正确的打印结果

或者,除了添加
\n
之外,还有更好的方法吗


示例中的数字只是示例。无论如何,它们都不是正确的测量值。

Graphics.MeasureString应该为您提供字符串的宽度。然后,当它达到最大值时,您可以将其拆分,也许可以使用StringBuilder,这样您就可以在运行时获得它

This is a printing
test!
更新:

        string text = "This is a printing test!";
        Font stringFont = new Font("Arial", 16);
        using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
        {
            var sb = new StringBuilder();
            foreach (var c in text.ToArray())
            {
                var l = g.MeasureString(sb.Append(c).ToString(), stringFont);
                if (l.Width >= 100)
                {
                    sb.Append(Environment.NewLine);
                }
                Console.WriteLine($"String: {sb.ToString()} Length: {l.Width.ToString()}");
            }
        }
更新(按单词而非字符分割):


我发现一件事很神奇

您可以使用DrawString将文本打印成矩形,然后它会自动为您包装文本

        using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
        {
            var words = s.Split(' ');
            var sb = new StringBuilder();
            var pw = 0d;
            foreach (var word in words)
            {
                var lw = Math.Floor(g.MeasureString($"{sb.ToString()} {word}", f).Width / w);
                if (lw != pw)
                {
                    sb.Append($"{Environment.NewLine}{word} ");
                    pw = lw;
                }
                else
                {
                    sb.Append($"{word} ");
                }
            }
            return sb.ToString();
        }

谢谢你的回答。。。但这是。。。辛苦!!!>“<没有更好的方法吗!?如果不知道每个字母的宽度以及要使用什么字体来显示它,就无法推断字符串的大小。你可以猜,但你总是错的。这是作为POC的快速代码。我确信它可以被清理。请参阅更新的代码。好的……说……如果我附加,会更好吗?”一次一个单词“!?”它不会在词的中间被切断吗?是的,这是有意义的。更新。
        using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
        {
            var words = s.Split(' ');
            var sb = new StringBuilder();
            var pw = 0d;
            foreach (var word in words)
            {
                var lw = Math.Floor(g.MeasureString($"{sb.ToString()} {word}", f).Width / w);
                if (lw != pw)
                {
                    sb.Append($"{Environment.NewLine}{word} ");
                    pw = lw;
                }
                else
                {
                    sb.Append($"{word} ");
                }
            }
            return sb.ToString();
        }
e.Graphics.DrawString(label1.Text,label1.Font,new SolidBrush(Color.Black),
new Rectangle(label1.Left,label1.Top,label1.Width,label1.Height));