在装饰层中突出显示或勾勒出任何UIElement

时间:2011-01-24 20:38:04

标签: wpf .net-3.5 adorner uielement

我希望能够以某种方式勾勒出或突出显示装饰图层中的任何特定UIElement(或甚至Visual)。 Adorner本身不是问题。我更关心的是创建UIElement的大纲。

我的目标是OuterGlowBitmapEffect提供的类似效果。我想要遵循UIElement的外轮廓。我已经尝试了很多方法来检查Clip属性(几乎总是为null)和其他一些方法,但我失败了。

现在我觉得这肯定很容易就是我错过了什么。此外,谷歌这次也不是我的朋友。

编辑:NET 3.5是一项要求

2 个答案:

答案 0 :(得分: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 :(得分:1)

一种方法是覆盖OnRenderUIElement的{​​{1}}。

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

如果您想在典型的矩形或圆角矩形之外提供强大的解决方案,则必须使用MSDN SimpleCircleAdorner example,这样您就可以构建由BezierSegment等段组成的路径,LineSegmentArcSegment因此在UIElement周围创建了适当的路径。

如果另一方面,矩形或圆角矩形就足够了,您可以分别在DrawingContext.DrawRectangle覆盖范围内使用DrawingContext.DrawRoundedRectangleOnRender