6

如果我想让列表框中选定项目的边缘看起来平滑,我这样做:

<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 个边框都平滑呢?

4

2 回答 2

6

OpacityMask是一种方法,正如其他人已经建议的那样,但这有点具有挑战性,因为你不能OpacityMask在画笔上设置一个。您只能在视觉上设置它 -OpacityMask是在每个视觉的基础上完成的。但是BackgroundaListBox不是可视树中的一个单独元素——它只是 的一个属性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>

请注意,我使用的是Effecta 而不是BitmapEffect. 使用 的选项较少Effect,但它们通常是更好的选择,因为它们设计用于在硬件中渲染。

于 2010-12-06T09:09:58.143 回答
0

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

于 2010-12-06T01:53:00.283 回答