3

我正在编写一些涉及 Adorners 的 WPF 代码。我正在使用 Josh Smith 的 UIElementAdorner.cs(在他的Infragistics 博客上的项目中找到)。我用信息文本的简介来装饰。我需要巧妙地放置我的装饰器,以免它从屏幕上剪掉。

确定我是否要剪辑的最佳方法是什么?

我正在使用以下代码来创建和放置我的装饰器。我有一个有趣的感觉,基于我是否会剪辑AdornerLayer并不是最好的选择。

var infoBubble = new InfoBubble {InformationText = @"I like cheese."};
var adornedElementRect = new Rect(Target.DesiredSize);
var layer = AdornerLayer.GetAdornerLayer(Target);

var adorner = new UiElementAdorner<Control>(Target) { Child = infoBubble };
adorner.Measure(new Size(layer.ActualWidth, layer.ActualHeight));

var adornerRect = new Rect(adorner.DesiredSize);
var top = -1*(adornerRect.Height);
var left = adornedElementRect.Width/2;

// Using layer to judge where to place the adorner
var upperLeftPoint = Target.TranslatePoint(new Point(left, top), layer);
var lowerRightPoint = Target.TranslatePoint(new Point(left + adornerRect.Width, 
    top + adornerRect.Height), layer);

if (upperLeftPoint.Y < 0) top -= upperLeftPoint.Y; // shift down by Y
if (lowerRightPoint.X > layer.ActualWidth) 
    left  -= (lowerRightPoint.X - layer.ActualWidth); // shift left

请记住,此代码包含在TargetedTriggerAction中,设计人员(也称为 Blend 的用户)希望在某些 UI 元素上方显示信息时使用该代码。因此,这段代码对要装饰的元素或其环境知之甚少。

4

1 回答 1

2

是的,这是我能辨别的最佳答案。

根据进一步阅读和一些实验,当调用 GetAdornerLayer 时,我们会收到视觉树中目标控件上方的最低层。这意味着我们可以在 Window 模板中定义的AdornerDecorator层之下获得一个层。那个较低的 AdornerDecorator 可能有 ClipToBounds="True" (我不知道为什么,但它可以)。

知道了这些信息,我可以相对确定我正在绘制的 AdorneLayer 是我正在绘制的任何内容的最佳边界框。我可以在此框外绘制(例如,如果在低于 Window 的 AdornerDecorator 上 ClipToBounds 为 False),但我不应该指望这种能力。

于 2010-08-10T21:42:45.260 回答