两个方向的WPF梯度
如果要使列表框中选定项目的边缘看起来平滑,请执行以下操作:两个方向的WPF梯度,wpf,gradient,brush,Wpf,Gradient,Brush,如果要使列表框中选定项目的边缘看起来平滑,请执行以下操作: <Setter Property="Background" TargetName="Bd"> <Setter.Value> <LinearGradientBrush EndPoint="0,0" StartPoint="1,0"> <GradientStop Offset="0" Color="Transparent"/>
<Setter Property="Background" TargetName="Bd">
<Setter.Value>
<LinearGradientBrush EndPoint="0,0" StartPoint="1,0">
<GradientStop Offset="0" Color="Transparent"/>
<GradientStop Offset="0.05" Color="{x:Static SystemColors.HighlightColor}"/>
<GradientStop Offset="0.95" Color="{x:Static SystemColors.HighlightColor}"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
但是,这只会使左右边缘平滑,而不会使顶部和底部平滑。如果我更改起点和终点,我可以使顶部和底部平滑,但随后我会使左右两侧的平滑度变差。那么,如何使用渐变笔刷使所有4个边界平滑呢?我认为内置渐变笔刷无法做到这一点。您可以实现自己的
矩形梯度画笔
,但我认为这并不容易。。。(实际上这似乎是不可能的,因为画笔
实现依赖于从用户代码无法访问的低级渲染内容)正如其他人已经建议的那样,不透明画笔
是实现这一点的一种方法,但它有点挑战性,因为您无法在画笔上设置不透明画笔
。您只能在视觉上进行设置-OpacityMask
是在每个视觉的基础上进行的操作。但是列表框
的背景
在可视化树中不是一个单独的元素-它只是列表框
的一个属性,它通常是绑定到模板中某个地方的边框
元素的模板
一些人在这里建议使用位图效果也是如此——这些效果也适用于整个视觉效果,而不是单个画笔
但是,您可以使用VisualBrush
-来处理此问题,它允许您使用可视化树定义笔刷。所以我认为这大致符合你的要求:
<Setter Property="Background" TargetName="Bd">
<Setter.Value>
<VisualBrush>
<VisualBrush.Visual>
<Rectangle Width="1" Height="1">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0,0" StartPoint="1,0">
<GradientStop Offset="0" Color="Transparent"/>
<GradientStop Offset="0.05" Color="{x:Static SystemColors.HighlightColor}"/>
<GradientStop Offset="0.95" Color="{x:Static SystemColors.HighlightColor}"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Rectangle.Fill>
<Rectangle.OpacityMask>
<LinearGradientBrush EndPoint="0,0" StartPoint="0,1">
<GradientStop Offset="0" Color="Transparent"/>
<GradientStop Offset="0.05" Color="White"/>
<GradientStop Offset="0.95" Color="White"/>
<GradientStop Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Rectangle.OpacityMask>
</Rectangle>
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
这些角落可能不是你想要的——这取决于它们最终有多大。当你使用这种技术时,它们看起来并不特别圆。所以你可以沿着效果路线走。您可能更喜欢这样:
<Setter Property="Background" TargetName="Bd">
<Setter.Value>
<VisualBrush Viewbox="0.1,0.1,0.8,0.8">
<VisualBrush.Visual>
<Border Width="100" Height="100" CornerRadius="10"
Background="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}">
<Border.Effect>
<BlurEffect Radius="20"/>
</Border.Effect>
</Border>
</VisualBrush.Visual>
</VisualBrush>
</Setter.Value>
</Setter>
请注意,我使用的是
效果
,而不是位图效果
。使用效果的选项较少
,但它们通常是一个更好的选项,因为它们是为在硬件中渲染而设计的。在另一个渐变上加一个渐变怎么样?也许吧,但这样你就需要使用不透明材质了,它可能会变得非常难看……谢谢!我用了模糊效果!