我希望能够以某种方式勾勒或突出装饰层中的任何特定UIElement(甚至可能Visual)。装饰器本身不是问题。我更关心创建UIElement.
我的目标是OuterGlowBitmapEffect提供类似的效果。我想跟随UIElement. 我尝试了许多方法来检查Clip属性(几乎总是为空)和其他一些方法,但我失败了。
现在我想这肯定很容易,只是我错过了一些东西。此外,谷歌这次也不是我的朋友。
编辑:NET 3.5 是一项要求
您可以将 anOpacityMask与 aVisualBrush一起使用,并将其Visual设置为您想要轮廓的元素。这是一个例子,我们Rectangle在前台有 a TabControl,在后台有 a 。由于选项卡控件不是矩形,我们可以看看该技术是否有效:
<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>
结果如下所示:

仅突出显示选项卡控件及其选项卡标题。
一种方法是覆盖MSDN SimpleCircleAdorner 示例OnRender中UIElement所见的。
// 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);
}
}
如果您想在典型的矩形或圆角矩形之外提供一个健壮的解决方案,您将不得不使用路径几何图形,这将允许您构建由诸如 a BezierSegment、 aLineSegment或 an等段组成的路径,ArcSegment从而在周围创建适当的路径UIElement. _
另一方面,如果一个矩形或圆角矩形就足够了,您可以在覆盖中分别使用DrawingContext.DrawRectangle和。DrawingContext.DrawRoundedRectangleOnRender