我有一个表单从文本框中读取文本,然后使用DrawString
中的System.Drawing.Graphics
方法绘制文本。
根据我使用的过载情况,结果会有所不同。需要额外StringFormat
的重载似乎忽略了标签。没有StringFormat
的重载就可以了。
结果如下:
这是代码:
public Form1()
{
InitializeComponent();
textBox1.AcceptsTab = true;
textBox1.Multiline = true;
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
Graphics g = this.CreateGraphics();
Font font = new Font("Arial", 20);
StringFormat format = StringFormat.GenericDefault;
format.Trimming = StringTrimming.None;
g.DrawLine(new Pen(Color.Black), new Point(10, 50), new Point(10, 140));
g.DrawString(textBox1.Text, font, Brushes.Black, new Point(10,60));
g.DrawString(textBox1.Text, font, Brushes.Black, new Point(10,100), format);
}
}
似乎我可以通过调用format.SetTabStops()
手动设置TabStop,但这不是首选解决方案。
我尝试设置format.Trimming = StringTrimming.None
,但这不起作用。
是否有可能在使用StringFormat
重载时从文本中打印标签?
答案 0 :(得分:0)
是的,它看起来像Graphics.DrawString
的设计谬误 - 具有不太详细的过载和更详细的过载,例如:
DrawString(String, Font, Brush, PointF)
DrawString(String, Font, Brush, PointF, StringFormat)
- 它不允许以一种完全类似于不太详细的重载行为的方式调用更详细的重载。
例如:
graphics.DrawString(…, new StringFormat())
会使所有标签为零宽度; var stringFormat = new StringFormat(); stringFormat.SetTabStops(0, new float[] { 8 }); graphics.DrawString(…, stringFormat)
会使所有标签的宽度为8像素,而不是8个空格; var stringFormat = new StringFormat(); stringFormat.SetTabStops(0, new float[] { Font.SizeInPoints / 2 * e.Graphics.DpiX / 72 * 8 }); graphics.DrawString(…, stringFormat)
之类的内容 - 事实上它的工作原理(指定的标签宽度与StringFormat
的标签宽度重合 - 少{{ 1}} - call; DrawString
数组中的最后一项应用于所有其他选项卡) - 但是文档的任何部分都不能保证它将来不会发生变化。当然,技术上调用float[]
- 更少StringFormat
重载相当于将DrawString
传递到null
参数 - 但这在实践中并没有帮助(例如,如果您想指定一些StringFormat
属性,但保留默认的tab-behavior)。