两个方向的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>


请注意,我使用的是
效果
,而不是
位图效果
。使用
效果的选项较少
,但它们通常是一个更好的选项,因为它们是为在硬件中渲染而设计的。

在另一个渐变上加一个渐变怎么样?也许吧,但这样你就需要使用不透明材质了,它可能会变得非常难看……谢谢!我用了模糊效果!