2011-01-24 8 views
2

アダーナーレイヤーで特定のUIElement(またはおそらくはVisual)のアウトラインまたはハイライトを強調したいと思います。 Adornerはそれ自体問題ではありません。私はUIElementの概要を作成することにもっと心配しています。アドラーレイヤー内の任意のUIElementをハイライトまたはアウトライン

OuterGlowBitmapEffectが提供する同様の効果を目指しています。私はUIElementの外側の輪郭に従いたいと思う。私はClipプロパティ(ほとんど常にnull)といくつかの他のメソッドを調べて多くのアプローチを試みましたが、私は悲惨に失敗しました。

今私はこれが確かに簡単でなければならないと思っています。それは、私が何かを欠いているということだけです。さらに、今回はGoogleも私の友人ではありませんでした。

EDIT:NET 3.5がある要件

+0

ハイライトをどのように見えるかのサンプルを提供できますか? 'DropShadowEffect'を試しましたか? –

+0

Aaronへの私のコメントを参照してください。私は「ビジュアル」の概要を強調したいと思います。私が考えていたのは、アウトラインの「Path」ジオメトリを取得して、それを単色とアニメーション不透明でいっぱいにしました。何らかの理由で*あらゆる*「Visual」の輪郭になっています。私は 'DropShadowEffect'を試していません。私は、影ではなく*オーバーレイ*効果のようなものを作り出すものにもっと興味を持っています。 – wpfwannabe

答えて

4

OpacityMaskにはVisualBrushVisualにはアウトラインを設定する要素を使用できます。ここでは、フォアグラウンドにRectangle、バックグラウンドにTabControlがある例を示します。タブコントロールが矩形でないので、技術が動作するかどうか、私たちは見ることができます:

<Grid Background="Gray"> 
    <TabControl Name="element"> 
     <TabItem Header="Tab1"> 
      <TextBlock Text="Hello, world!" FontSize="40" FontWeight="Bold"/> 
     </TabItem> 
    </TabControl> 
    <Rectangle Fill="Yellow" Opacity="0.5"> 
     <Rectangle.OpacityMask> 
      <VisualBrush Visual="{Binding ElementName=element}"/> 
     </Rectangle.OpacityMask> 
    </Rectangle> 
</Grid> 

結果は次のようになります。

Visual Outline of a Control

のみタブコントロールとそのタブ・ヘッダーが強調表示されています。

+0

私は前に 'ViusalBrush'と組み合わせて' OpacityMask'を見つけましたが、私は完全な実例を見たことがありません。あなたのスクリーンショットは、これが実際に私のためのトリックを行うかもしれないことを示しているようです。どうもありがとう! – wpfwannabe

1

一つの方法は、MSDN SimpleCircleAdorner exampleに見られるようUIElementOnRenderをオーバーライドすることです。

// A common way to implement an adorner's rendering behavior is to override the OnRender 
    // method, which is called by the layout system as part of a rendering pass. 
    protected override void OnRender(DrawingContext drawingContext) 
    { 
    Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize); 

    // Some arbitrary drawing implements. 
    SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green); 
    renderBrush.Opacity = 0.2; 
    Pen renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5); 
    double renderRadius = 5.0; 

    // Draw a circle at each corner. 
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius); 
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius); 
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius); 
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius); 
    } 
} 

あなたは、あなたが、このようBezierSegmentとしてLineSegmentセグメントで構成パスを構築することができますpath geometriesを利用する必要があります典型的な長方形または角丸長方形の外堅牢なソリューションを提供したい場合は 、またはArcSegmentのように適切なパスを作成してUIElementの周りに適切なパスを作成します。

一方、長方形または丸みのある四角形であれば、OnRenderオーバーライド内でDrawingContext.DrawRectangleDrawingContext.DrawRoundedRectangleをそれぞれ使用できます。

+0

+1、提案されたソリューションに感謝します。残念ながら、私が探しているのは、単純な(丸い)矩形だけでなく、 'UIElement'(または' Visual')の概要に従っていることです。私はあなたが話している道を得ることを考えていましたが、プログラム的な方法で考えました。私は、このアプローチが*すべての* UIElementで動作するようにしたい、あらかじめ定義されたシェイプのセットではない。 – wpfwannabe

関連する問題