2011-01-24 33 views
2

我希望能夠以某種方式勾畫或突出顯示裝飾層中的任何特定UIElement(或者甚至可以是Visual)。裝飾者本身不是問題。我更關心的是創建一個UIElement的輪廓。突出或勾勒裝飾層中的任何UIElement

我的目標在那OuterGlowBitmapEffect提供類似的效果。我想要遵循UIElement的外部輪廓。我已經嘗試了很多方法來檢查Clip屬性(幾乎總是空)和其他一些方法,但我失敗了。

現在,我想這肯定是容易的,這只是,我失去了一些東西。另外,谷歌這次也不是我的朋友。

編輯:NET 3.5是一個要求

+0

你能提供一個你想要突出顯示的樣本嗎?你有沒有試過`DropShadowEffect`? – 2011-01-24 20:58:05

+0

請參閱我對Aaron的評論。我想強調「視覺」的概要。我在想的是獲得輪廓的「路徑」幾何體,並使用填充了純色和動畫不透明度的幾何體。基礎是以某種方式進入* any *`Visual`的輪廓。我還沒有嘗試過`DropShadowEffect`。我會對某種產生某種* overlay *效果的東西感興趣,而不是影子。 – wpfwannabe 2011-01-24 21:56:53

回答

4

您可以將OpacityMaskVisualBrush及其Visual設置爲您想要的輪廓元素。這裏有一個例子,我們在前臺有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

只有標籤控件,其標籤標題突出顯示。

1

一種方法是覆蓋UIElementOnRender作爲MSDN SimpleCircleAdorner example看到。

// 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); 
    } 
} 

如果你想提供一個典型的矩形或圓角矩形,你將不得不使用path geometries,讓您打造出一個片段組成的路徑,如BezierSegment,一個LineSegment外的強大的解決方案,或ArcSegment,從而在UIElement周圍創建適當的路徑。

如果另一方面矩形或圓角矩形就足夠了,則可以在OnRender重寫中分別使用DrawingContext.DrawRectangleDrawingContext.DrawRoundedRectangle

+0

+1,非常感謝您提出的解決方案。不幸的是,我在尋找的是「UIElement」(或「Visual」)的輪廓,而不僅僅是簡單的(圓形的)矩形。我正在考慮讓你談論的道路,但以一種程序化的方式。我希望這種方法適用於任何* UIElement,而不是一些預定義的形狀。 – wpfwannabe 2011-01-24 21:51:07