在形状上绘制文字

时间:2011-11-02 07:57:53

标签: c# wpf shape

我想按照http://msdn.microsoft.com/en-us/library/aa327572%28v=vs.71%29.aspxhttp://www.switchonthecode.com/tutorials/csharp-snippet-tutorial-how-to-draw-text-on-an-image中的示例在某些形状上绘制字符串。我使用C#,所以在任何情况下我都需要PaintEventArgs e。但是,当我在DrawStringRectangleF(PaintEventArgs e)之类的方法中将其作为参数插入时,它不会(如预期的那样)直接识别。我导入System.Windows.Forms.PaintEventArgs并且字段“Forms”仍然无法识别?我该怎么办?

还有其他更简单的方法可以在形状上分配文字,我可以调整哪种风格?

2 个答案:

答案 0 :(得分:0)

对于初学者来说,如果您使用的是WinForms,则可以通过覆盖OnPaint方法并将控件样式设置为手动绘制来获取图形对象。像这样

... .ctor()
{
    ...
    // indicate user will paint
    SetStyle(ControlStyles.UserPaint, true);

    // rest is optional if you want/need it
    SetStyle(ControlStyles.AllPaintingInWmPaint, true);   
    SetStyle(ControlStyles.ResizeRedraw, true);
    SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    SetStyle(ControlStyles.Opaque, true);
}

protected override void OnPaint(PaintEventArgs p)
{
    // depending on how you set the control styles, you might need
    // this to draw the background of your control wit a call to the methods base
    base.OnPaint(p);

    Graphics g = p.Graphics;
    // ... Do your painting here with g ....
}

但是,由于您还将此标记为WPF,因此请注意,这在wpf中不起作用。我在这个课程上不是很先进,但是我使用了UIElement.OnRender方法的覆盖并取得了很好的效果。它将为您提供一个DrawingContext对象,而不是PaintEventArgs对象。但它们的工作方式大致相同。另外,您不需要设置控件样式。

答案 1 :(得分:0)

由于您使用的是WPF,只需将shapeTextBlock放入允许控件重叠的容器中,例如GridCanvas

<Grid>
    <Rectangle ... />
    <TextBlock Text="Test" 
               HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>