我见过各种对WPF效果的引用,但似乎它们是用于位图,而不是文本。是否可以将模糊或投影以外的效果应用于XAML中的 TextBlock 对象?
我想要做的例子可能是轮廓笔划或斜角/浮雕效果。
您是否可以在XAML中将TextBlock转换为位图,然后对其应用位图效果?
图书馆会很好,但是我自己也编码,但我甚至不知道从哪里开始。可能吗?如果是这样,你怎么做?
答案 0 :(得分:3)
我认为你在这里基本上有两个选择,你使用哪个选项取决于你想要实现的具体效果。你甚至可能想要两者。
正如Frank J在他的回答中所提到的,FormattedText
课程有很多权力,可以让你做很多事情。您可以在this page上看到几个示例。
您可以构建扩展基类(如FrameworkElement
)的自定义元素,并覆盖OnRender
方法,以使用绘图上下文中的DrawText
方法呈现文本。您将需要一些方法来指定和自定义要用于控件的每个实例的效果。我可以想到两种方法:
为每个可自定义的内容添加依赖项属性到控件,并根据这些属性确定在OnRender
中呈现的内容。
或者,向控件添加依赖项属性以允许您指定要使用的效果。它将被键入为您使用适当的API创建的效果基类或接口以使用效果。然后,您可以为要实现的每种类型的效果创建派生类。这类似于WPF与Effect
属性一起使用的模式,但使用您自己的效果系统。
注意:确保您定义的任何对渲染有影响的依赖项属性在创建元数据时在其中设置AffectsRender标记。
另一种选择是利用WPF提供的现有效果系统并编写自己的着色器效果。设置一个以这种方式创建效果的过程需要一些学习,但是一旦你这样做,添加新效果相对容易。
警告:如果在没有硬件加速的情况下渲染效果(例如渲染到RenderTargetBitmap时),将效果应用于元素可能会导致渲染效果非常差。如果您谨慎使用它们,您将不会注意到它,但在屏幕上获取太多它们并且您的应用程序可能会慢慢爬行。小心使用。
以下是开始使用着色器效果的步骤。
如果您还不熟悉,请了解HLSL(至少是基础知识)。它是用于编写WPF(和DirectX)兼容着色器的语言。您只需要担心WPF的像素着色器,而不是顶点或几何着色器。
如果您没有安装某个版本的Windows SDK,请安装它。它包括HLSL着色器编译器命令行程序:FXC。您需要它来编译着色器,然后才能在WPF中使用它们。您可以手动运行它,或通过在Visual Studio中配置构建步骤以在给定项目中为您运行它来简化该过程。
一旦编译了着色器,您就会希望将它们作为资源添加到将要定义它们的WPF库或应用程序中。
最后,创建并实现一个扩展ShaderEffect并将其设置为与着色器一起使用的类。可以将此类的实例分配给任何元素上的Effect
属性,类似于WPF附带的内置效果。
如果您想要更完整的着色器效果指南,请在网页上搜索 WPF着色器效果,您会在那里找到一些。
现有着色器效果
如果您不需要完全自定义的内容,则可以使用第三方着色器效果。甚至有一些effects created by Microsoft作为独立下载提供。
答案 1 :(得分:1)
使用Typography in WPF查看FormattedText
文章,了解更多高级效果。
以下是drawing FormattedText
的MSDN帮助。