首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是否应该使用AdornerLayer来避免在屏幕外裁剪我的装饰器?

我是否应该使用AdornerLayer来避免在屏幕外裁剪我的装饰器?
EN

Stack Overflow用户
提问于 2010-08-04 05:54:11
回答 1查看 1.8K关注 0票数 3

我正在写一些涉及Adorners的WPF代码。我正在使用Josh Smith的UIElementAdorner.cs (在他的Infragistics Blog上的项目中找到)。我正在用一个信息文本的简介来装饰。我需要巧妙地放置我的装饰品,这样它就不会从屏幕上剪下来。

如果我要裁剪,最好的方法是什么?

我使用下面的代码来创建和放置我的装饰器。我有一种奇怪的感觉,不管我是否要在AdornerLayer上裁剪,都不是最好的选择。

代码语言:javascript
复制
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元素上显示信息时,可以使用该UI。因此,此代码对要修饰的元素或其环境知之甚少。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-08-11 05:42:45

是的,这是我能看出来的最好的答案。

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

了解了这些信息后,我可以相对确定我正在绘制的AdorneLayer是我正在绘制的任何内容的最佳边界框。我可以有能力在这个框之外绘制(例如,如果ClipToBounds在比窗口更低的AdornerDecorator上为False ),但我不应该指望这种能力。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3401072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档