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

他の人がすでに示唆しているように、これを行う1つの方法ですが、ブラシにOpacityMask設定できないため、少し難しいです。OpacityMaskビジュアルでのみ設定できます-OpacityMaskビジュアルごとに行われるものです。ただし、BackgroundListBoxはビジュアルツリー内の個別の要素ではありません。これは、のプロパティにすぎず、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、ハードウェアでレンダリングするように設計されているため、通常はより適切なオプションです。

于 2010-12-06T09:09:58.143 に答える
0

内蔵のグラデーションブラシではできないと思います。独自に実装することもできますがRectangleGradientBrush、簡単ではないと思います...Brush (実装は、ユーザーコードからアクセスできない低レベルのレンダリングに依存しているため、実際には不可能と思われます)

于 2010-12-06T01:53:00.283 に答える