2011-01-24 2 views
2

어도비 레이어에서 특정 UIElement (또는 아마도 Visual)을 윤곽을 지정하거나 강조 표시하고 싶습니다. Adorner는 그 자체로 문제가 아닙니다. 나는 UIElement의 윤곽을 그리는 것에 더 관심이 있습니다.adorner 레이어의 UIElement를 강조 표시하거나 윤곽을 잡습니다.

나는 OuterGlowBitmapEffect이 제공하는 유사한 효과를 목표로합니다. UIElement의 바깥 쪽 윤곽을 따라 가고 싶습니다. Clip 속성 (거의 항상 null)과 다른 방법을 사용하여 많은 접근법을 시도했지만 비참하게 실패했습니다.

이제 나는 이것이 분명히 쉬울 것이라고 생각하고 있습니다. 그것은 제가 누락 된 것입니다. 또한 이번에도 Google은 내 친구가 아니 었습니다.

편집 : 3.5 NET은

+0

강조 표시 방법에 대한 견본을 제공 할 수 있습니까? DropShadowEffect를 사용해 보셨습니까? –

+0

Aaron에 대한 내 의견보기. 나는 '시각적'의 윤곽을 강조하고 싶다. 내가 생각한 것은 외곽선의 '경로'기하학을 얻고 그것을 단색과 애니메이션 불투명도로 채운 것입니다. 기초가 어떤 식 으로든 * 모든 *'비주얼 '의 윤곽을 그리는 것입니다. 'DropShadowEffect'를 시도하지 않았습니다. 나는 그림자가 아닌 오버레이 * 효과를 생성하는 것에 더 관심이 있습니다. – wpfwannabe

답변

4

윤곽선을 지정할 요소에 Visual이 설정된 VisualBrushOpacityMask을 사용할 수 있습니다. 다음은 포드 그라운드에 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