在Silverlight中如何将字符串绘制到位图上?

5
在普通的C#中,使用Graphics.DrawString()方法很容易绘制位图。但是在Silverlight中,Bitmap对象已经被取消,而Graphics也不再可用。那么...当使用Silverlight时,我应该如何操作/创建位图呢?如果有帮助的话,我正在使用Silverlight 3。
让我告诉您我正在做什么。我得到了一个模板,基本上是一个预先渲染的图像。然后用户可以从多个图像中选择并输入所需的文本。然后我会将其渲染到图像中,在图像的预定义区域内进行大小调整等操作,并使其居中。如果我可以计算大小(就像MeasureString方法一样),然后绘制字符串(就像Graphics.DrawString方法一样),那就没问题了。无论为什么,真正的问题是能否做到这一点?

2
那些提供建议的人总是担心他们的建议是否适用于手头的问题。不知道某人为什么想做某事(尤其是表面上看起来不明智的事情)会让我们感到不舒服。提供为什么的原因可能会让某人提供一个更侧面的解决方案,这是您可能尚未考虑过的。 - AnthonyWJones
2个回答

3
问题是: 为什么你想要这样做?为什么不直接使用TextBlock
如果你想要动态生成图像,请使用标准的Silverlight/WPF控件(包括TextBlock),并将它们渲染WritableBitmap中。 编辑:

好的,你已经更新并扩展了内容,这使我有更多的信息可以参考。不幸的是,你可能不会喜欢答案。首先,请记住Silverlight和WPF通常是基于矢量的,并且旨在以此方式使用。尽管Canvas允许您进行伪像素操作,但您无法像老式GDI那样准确地控制像素。这是您媒介的一个因素。如果您绝对必须按照您想要测量的方式测量事物,我建议您在远程服务器上构建图像,并将它们传输到Silverlight应用程序中。

您可以使用ActualWidth和ActualHeight属性计算通过TextBlock呈现的文本在屏幕上的大小。但它只适用于已呈现的控件。在Silverlight中根本没有类似MeasureString的东西。根据您对应用程序的描述,一些用户交互可以实现您想要的效果。用户选择图像,输入文本,然后显示预览。用户随后可以调整各种文本区域的宽度和高度,直到满意为止,此时您可以使用我上面提到的渲染方法进行快照。


好的...那么我该怎么做呢?让我告诉你我在做什么。 我被给予一个模板,基本上是一个预先渲染的图像。 然后用户可以从多个图像中选择并输入所需文本。 然后我将其渲染到图像中,在图像的预定义区域内进行大小调整等操作,并将其居中。 如果我可以计算出大小(就像MeasureString方法一样)然后使用您的技术绘制给定的字符串(就像Graphics.DrawString方法一样),那就没问题了。无论我为什么想要这样做,真正的问题是它是否可行? - Spenduku
@Spencer:你应该把那个评论移到你的问题中。 - John Knoeller
答案可能并不是我所期望的,但它似乎是唯一可行的方法。所以谢谢! :) - Spenduku
很高兴能帮到你。祝你好运! - Randolpho

3
以下是可能有效的方法,因为我自己还没有尝试过,有些模糊。
你需要的对象是 WritableBitmap
创建一个可视化树,例如创建一个 GridCanvas(不要将其添加到 UI 中)。将所选图像和一个按您喜好定位和调整大小的 TextBlock 添加到其中。
创建一个新的 WritableBitmap,可以指定大小或使用所选图像进行初始化。
使用 WritableBitmapRender 方法,将上述根 GridCanvas 传递给它。
现在你有了一个位图,你应该能够用它来做任何需要这些操作的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接