如何使用WPF效果模仿OuterGlowBitmapEffect?
How to imitate OuterGlowBitmapEffect using WPF effects?
我尝试使用 DropShadowEffect,但当您增加 BlurRadius 时,它的“发光”强度会减弱。我想要像下图这样强烈的外发光。
如果我将相同的效果叠加十几次我就能得到这个,但之后性能会下降。使用 WPF 可以实现单一效果吗?
根据您希望模糊半径的大小以及结果需要的平滑度,您可以堆叠不同的效果(例如渐变停止),而不是重复堆叠相同的效果。
正如您所指出的,DropShadowEffect
强度随着 BlurRadius
的增加而减弱。
<TextBox Text="DropShadowEffect">
<TextBox.Effect>
<DropShadowEffect BlurRadius="50"
ShadowDepth="0"
Color="Blue"
Opacity="1"/>
</TextBox.Effect>
</TextBox>
此外,直接将效果应用到元素后面的 TextBox
impacts the rendering quality of the text. The proposed solution to the linked question (setting TextOptions.TextFormattingMode="Display"
on the Window
) also has layout implications. Instead, you can draw a Rectangle
with a BlurEffect
。
<Rectangle Fill="Blue"
Height={Binding ElementName=MyTextBox, Path=ActualHeight}"
Width={Binding ElementName=MyTextBox, Path=ActualWidth}">
<Rectangle.Effect>
<BlurEffect Radius="50"/>
</Rectangle.Effect>
</Rectangle>
<TextBox x:Name="MyTextBox" Text="Rectangle with BlurEffect"/>
然后您可以为每个渐变停止添加额外的 Rectangle
。这里有两个:一个在 50
用于定义模糊的整体大小,一个在 30
用于加强控件周围的光晕。
<Rectangle Fill="Blue"
Height={Binding ElementName=MyTextBox, Path=ActualHeight}"
Width={Binding ElementName=MyTextBox, Path=ActualWidth}">
<Rectangle.Effect>
<BlurEffect Radius="50"/>
</Rectangle.Effect>
</Rectangle>
<Rectangle Fill="Blue"
Height={Binding ElementName=MyTextBox, Path=ActualHeight}"
Width={Binding ElementName=MyTextBox, Path=ActualWidth}">
<Rectangle.Effect>
<BlurEffect Radius="30"/>
</Rectangle.Effect>
</Rectangle>
<TextBox x:Name="MyTextBox" Text="Two Rectangles with BlurEffect"/>
您询问了 TextBox
拐角处的感知清晰度,我必须承认我没有好的解决方案。我最初考虑使用 Border
而不是 Rectangle
来圆化控件后面模糊元素的角,但老实说,我看不出有什么区别。
<!-- Remove the CornerRadius property for square corners. -->
<Border CornerRadius="10" Background="Blue">
<Border.Effect>
<BlurEffect Radius="50"/>
</Border.Effect>
</Border>
<Border CornerRadius="10" Background="Blue">
<Border.Effect>
<BlurEffect Radius="30"/>
</Border.Effect>
</Border>
当然,您始终可以使背景对象大于您的控件。这里它们在 Grid
的同一个单元格中,但是 Border
有额外的 space 可以增长,因为 TextBox
有一个 Margin
。较小的 top/bottom 边距和较大的 left/right 边距意味着控件周围的发光会更均匀。
<!-- These items should be in the same cell of a Grid -->
<Border CornerRadius="10" Background="Blue">
<Border.Effect>
<BlurEffect Radius="50"/>
</Border.Effect>
</Border>
<Border CornerRadius="10" Background="Blue">
<Border.Effect>
<BlurEffect Radius="30"/>
</Border.Effect>
</Border>
<TextBox Text="TextBox has an 8px, 4px margin" Margin="8 4"/>
我尝试使用 DropShadowEffect,但当您增加 BlurRadius 时,它的“发光”强度会减弱。我想要像下图这样强烈的外发光。
如果我将相同的效果叠加十几次我就能得到这个,但之后性能会下降。使用 WPF 可以实现单一效果吗?
根据您希望模糊半径的大小以及结果需要的平滑度,您可以堆叠不同的效果(例如渐变停止),而不是重复堆叠相同的效果。
正如您所指出的,DropShadowEffect
强度随着 BlurRadius
的增加而减弱。
<TextBox Text="DropShadowEffect">
<TextBox.Effect>
<DropShadowEffect BlurRadius="50"
ShadowDepth="0"
Color="Blue"
Opacity="1"/>
</TextBox.Effect>
</TextBox>
此外,直接将效果应用到元素后面的 TextBox
impacts the rendering quality of the text. The proposed solution to the linked question (setting TextOptions.TextFormattingMode="Display"
on the Window
) also has layout implications. Instead, you can draw a Rectangle
with a BlurEffect
。
<Rectangle Fill="Blue"
Height={Binding ElementName=MyTextBox, Path=ActualHeight}"
Width={Binding ElementName=MyTextBox, Path=ActualWidth}">
<Rectangle.Effect>
<BlurEffect Radius="50"/>
</Rectangle.Effect>
</Rectangle>
<TextBox x:Name="MyTextBox" Text="Rectangle with BlurEffect"/>
然后您可以为每个渐变停止添加额外的 Rectangle
。这里有两个:一个在 50
用于定义模糊的整体大小,一个在 30
用于加强控件周围的光晕。
<Rectangle Fill="Blue"
Height={Binding ElementName=MyTextBox, Path=ActualHeight}"
Width={Binding ElementName=MyTextBox, Path=ActualWidth}">
<Rectangle.Effect>
<BlurEffect Radius="50"/>
</Rectangle.Effect>
</Rectangle>
<Rectangle Fill="Blue"
Height={Binding ElementName=MyTextBox, Path=ActualHeight}"
Width={Binding ElementName=MyTextBox, Path=ActualWidth}">
<Rectangle.Effect>
<BlurEffect Radius="30"/>
</Rectangle.Effect>
</Rectangle>
<TextBox x:Name="MyTextBox" Text="Two Rectangles with BlurEffect"/>
您询问了 TextBox
拐角处的感知清晰度,我必须承认我没有好的解决方案。我最初考虑使用 Border
而不是 Rectangle
来圆化控件后面模糊元素的角,但老实说,我看不出有什么区别。
<!-- Remove the CornerRadius property for square corners. -->
<Border CornerRadius="10" Background="Blue">
<Border.Effect>
<BlurEffect Radius="50"/>
</Border.Effect>
</Border>
<Border CornerRadius="10" Background="Blue">
<Border.Effect>
<BlurEffect Radius="30"/>
</Border.Effect>
</Border>
当然,您始终可以使背景对象大于您的控件。这里它们在 Grid
的同一个单元格中,但是 Border
有额外的 space 可以增长,因为 TextBox
有一个 Margin
。较小的 top/bottom 边距和较大的 left/right 边距意味着控件周围的发光会更均匀。
<!-- These items should be in the same cell of a Grid -->
<Border CornerRadius="10" Background="Blue">
<Border.Effect>
<BlurEffect Radius="50"/>
</Border.Effect>
</Border>
<Border CornerRadius="10" Background="Blue">
<Border.Effect>
<BlurEffect Radius="30"/>
</Border.Effect>
</Border>
<TextBox Text="TextBox has an 8px, 4px margin" Margin="8 4"/>