Textblock没有实现stroke属性,并且是一个密封类。最常见的解决方法是使用create your own textblock class from FrameworkElement。但是,我最近偶然发现了DropShadowEffect,我想知道是否有可能使用自定义效果来获得相同的轮廓文本结果,而无需实现整个轮廓文本块。(我希望DropShadow能给我一个更清晰的轮廓。)
为此,我尝试创建一个继承自Effect的类,但立即遇到了问题:
namespace MyNamespace;
public class OutlineEffect : Effect
{
internal override Channel GetChannelCore(int index)
{
//How am I supposed to override an internal class in a Microsoft namespace?
}
//...
}
在documentation中它确实说:
从Effect类派生以实现自定义位图效果。在大多数情况下,将从ShaderEffect派生
所以我认为这是可能的。那么,你是如何从效果中推导出来的?
1条答案
按热度按时间ogsagwnx1#
您必须从ShaderEffect而不是Effect继承。以下是使用边缘检测滤镜效果来显示文本轮廓的示例:
结合Shader tutorial和Prewitt Edge Detection Filter,我设法在文本周围得到了一个不错的轮廓效果。还有其他方法可以得到类似的效果,比如creating your own outline text block,但是使用效果的优势是使用GPU渲染,并且可以通用地应用到任何UIElement。但是,我不得不使用EdgeResponse属性来得到一个不错的轮廓。
XAML中的最终结果:
为了创建效果,我首先创建了EdgeDetectionColorEffect.fx(hdld)文件-这是GPU用来过滤图像的代码。
边缘Focc.ps检测颜色效果
下面是wpf效果类: