我希望能够以某种方式勾勒或突出装饰层中的任何特定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.DrawRoundedRectangle
OnRender