2

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

我的目标是OuterGlowBitmapEffect提供类似的效果。我想跟随UIElement. 我尝试了许多方法来检查Clip属性(几乎总是为空)和其他一些方法,但我失败了。

现在我想这肯定很容易,只是我错过了一些东西。此外,谷歌这次也不是我的朋友。

编辑:NET 3.5 是一项要求

4

2 回答 2

4

您可以将 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>

结果如下所示:

控件的视觉轮廓

仅突出显示选项卡控件及其选项卡标题。

于 2011-01-25T06:26:53.337 回答
1

一种方法是覆盖MSDN SimpleCircleAdorner 示例OnRenderUIElement所见的。

  // 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

于 2011-01-24T21:04:01.243 回答