我希望能够以某种方式勾勒出或突出显示装饰图层中的任何特定UIElement
(或甚至Visual
)。 Adorner本身不是问题。我更关心的是创建UIElement
的大纲。
我的目标是OuterGlowBitmapEffect
提供的类似效果。我想要遵循UIElement
的外轮廓。我已经尝试了很多方法来检查Clip
属性(几乎总是为null)和其他一些方法,但我失败了。
现在我觉得这肯定很容易就是我错过了什么。此外,谷歌这次也不是我的朋友。
编辑:NET 3.5是一项要求
答案 0 :(得分:4)
您可以将OpacityMask
与VisualBrush
一起使用,并将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>
结果如下:
仅突出显示选项卡控件及其选项卡标题。
答案 1 :(得分:1)
一种方法是覆盖OnRender
中UIElement
的{{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
等段组成的路径,LineSegment
或ArcSegment
因此在UIElement
周围创建了适当的路径。
如果另一方面,矩形或圆角矩形就足够了,您可以分别在DrawingContext.DrawRectangle
覆盖范围内使用DrawingContext.DrawRoundedRectangle
和OnRender
。