2010-12-06 57 views
6

如果我想打一个选择项的边缘在ListBox看起来光滑我这样做:WPF梯度在2个方向

<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> 

然而,这不仅使左,右边缘光滑,不顶和底部。如果我改变StartPoint和EndPoint,我可以使顶部和底部平滑,但是然后我放松左侧&右侧的平滑度。那么如何使用渐变画笔使所有4个边界平滑?

回答

5

的与其他人已经建议的一样,OpacityMask就是这样做的一种方式,但它有点具有挑战性,因为您无法在画笔上设置OpacityMask。你只能在视觉上设置它 - OpacityMask是在每个视觉基础上完成的。但ListBoxBackground不是视觉树中的独立元素 - 它只是ListBox的一个属性,它通常是模板绑定到类似Border元素的某个位置。

这同样适用于某些人在这里提出的位图效果 - 这些也适用于整个视觉效果,而不适用于单个画笔。

但是,您可以使用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> 

请注意,我用的Effect而不是BitmapEffect。与Effect相比,您的选项更少,但它们通常是更好的选择,因为它们旨在以硬件呈现。

0

我不认为它可以用内置的渐变画笔完成。 你可以实现自己的 RectangleGradientBrush,但我不认为这是很容易... (实际上它似乎并不可能,因为Brush的实现依赖于低级别渲染的东西,是不能访问从用户代码)

+0

另一个渐变顶部的渐变怎么样? – Machinarius 2010-12-06 02:18:36

+0

也许,但那么你将需要玩OpacityMask,它可能会变得非常难看... – 2010-12-06 08:45:05