【问题标题】:WPF Effects - on textWPF 效果 - 在文本上
【发布时间】:2015-05-28 19:53:54
【问题描述】:

我已经看到了各种对 WPF 效果的引用,但似乎它们是针对位图的,而不是针对文本的。是否可以将 BlurDrop Shadow 以外的效果应用于 XAML 中的 TextBlock 对象?

我想要做的示例可能是轮廓描边或斜角/浮雕效果。

是否可以在 XAML 中将 TextBlock 转换为位图,然后对其应用位图效果?

图书馆可以,但我自己编写代码也可以,但我什至不知道从哪里开始。是否可以?如果是这样,你是怎么做的?

【问题讨论】:

  • 你能发布你想做的事情和你尝试完成的事情吗?stackoverflow 不允许提出问题要求我们推荐或查找书籍、工具、软件库、教程或其他关闭- 站点资源与 Stack Overflow 无关,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。这类问题通常会被标记,但如果您编辑问题,您可以避免这种情况并获得一些答案
  • 我不一定有特定的效果,但是像在文本中添加轮廓描边之类的就是一个例子。或应用斜角/浮雕效果。我一直在网上搜索并没有找到太多信息。
  • 我建议您编辑您的问题以包含该信息并删除要求库的部分。
  • 我真的没想过我会要求一个图书馆......我只是想确定这种东西是否存在。

标签: wpf wpf-4.0


【解决方案1】:

我认为您在这里基本上有两种选择,而您使用哪一种实际上取决于您要实现的特定效果。你甚至可能两者都想要。

自定义元素

正如 Frank J 在他的回答中提到的,FormattedText 类具有很大的功能,可以让你做很多事情。您可以在this page 上看到几个示例。

您可以构建一个自定义元素来扩展基类(例如FrameworkElement)并覆盖OnRender 方法以在绘图上下文中使用DrawText 方法呈现您的文本。您将需要某种方法来指定和自定义要用于每个控件实例的效果。我可以想到两种方法:

  1. 为每个可自定义的事物添加依赖属性到控件,并根据这些属性确定在OnRender 中呈现的内容。

  2. 或者,向控件添加依赖属性,以允许您指定要使用的效果。它将被键入为效果基类或接口,您使用适当的 API 创建以使用效果。然后,您可以为要实现的每种效果类型创建派生类。这类似于 WPF 使用 Effect 属性的模式,但使用您自己的效果系统。

注意:确保您定义的任何对渲染有影响的依赖属性在您创建它们时在其元数据中设置AffectsRender 标志。

着色器效果

另一种选择是利用 WPF 提供的现有效果系统并编写自己的着色器效果。以这种方式设置创建效果的过程需要一些学习,但是一旦你这样做了,添加新效果就相对容易了。

警告:如果在没有硬件加速的情况下渲染元素(例如渲染到 RenderTargetBitmap 时),对元素应用效果可能会导致它们的渲染性能非常差。如果您有节制地使用它们,您不会注意到它,但是如果它们在屏幕上出现太多,您的应用程序可能会慢到爬行。小心使用。

您可以按照以下步骤开始使用着色器效果。

  1. 如果您还不熟悉,请了解HLSL(至少是基础知识)。它是用于编写 WPF(和 DirectX)兼容着色器的语言。您只需要担心 WPF 的像素着色器,而不是顶点或几何着色器。

  2. 如果您没有某个版本的 Windows SDK,请安装它。它包括 HLSL 着色器编译器命令行程序:FXC。您将需要它来编译着色器,然后才能在 WPF 中使用它们。您可以手动运行它,也可以通过在 Visual Studio 中配置构建步骤以在给定项目中为您运行它来简化流程。

  3. 一旦您编译了着色器,您就需要将它们作为资源添加到您的 WPF 库或将要定义它们的应用程序中。

  4. 最后,创建并实现一个扩展 ShaderEffect 的类,并将其设置为与您的着色器一起使用。可以将此类的实例分配给任何元素上的 Effect 属性,类似于 WPF 附带的内置效果。

如果您想要更完整的着色器效果指南,请在网络上搜索 WPF 着色器效果,您会找到一些。

现有的着色器效果

如果您不需要完全自定义的东西,可以使用第三方着色器效果。甚至还有一些effects created by Microsoft 以独立下载的形式提供。

【讨论】:

    【解决方案2】:

    查看Typography in WPF 文章,了解使用FormattedText 的更高级效果。

    这里是 drawing FormattedText 的 MSDN 帮助。

    【讨论】:

    • 感谢您的努力,Frank,但我的问题是关于向 TextBlock 添加效果其他而不是 DropShadow 和 Blur。
    • 更新了我的答案以删除您已经弄清楚的不相关部分。其余的内容包括轮廓和画笔。
    • FormattedText 类不是您可以直接在 XAML 中使用的东西。我想如果我最终必须自己编写代码,我会创建一个新的 UIELement 子类,它使用 FormattedText 来完成任务,但我希望有一个我还没有找到一些现有的 XAML 技巧。
    • 如果您决定使用自定义控件,请扩展 FrameworkElement 而不是 UIElement 以免费获得许多有用的布局功能,例如边距和对齐方式。
    • 弗兰克,我必须道歉......我想我在使用平板电脑时不小心对你的问题投了反对票。我不是故意的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2011-09-20
    相关资源
    最近更新 更多