我正在写一些涉及Adorners的WPF代码。我正在使用Josh Smith的UIElementAdorner.cs (在他的Infragistics Blog上的项目中找到)。我正在用一个信息文本的简介来装饰。我需要巧妙地放置我的装饰品,这样它就不会从屏幕上剪下来。
如果我要裁剪,最好的方法是什么?
我使用下面的代码来创建和放置我的装饰器。我有一种奇怪的感觉,不管我是否要在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元素上显示信息时,可以使用该UI。因此,此代码对要修饰的元素或其环境知之甚少。
发布于 2010-08-11 05:42:45
是的,这是我能看出来的最好的答案。
根据进一步的阅读和一些实验,当调用GetAdornerLayer时,我们得到视觉树中目标控件之上的最低层。这意味着我们可以在窗口模板中定义的AdornerDecorator层的下面得到一个层,这个较低的AdornerDecorator可能有ClipToBounds="True“(我不知道为什么,但它可以)。
了解了这些信息后,我可以相对确定我正在绘制的AdorneLayer是我正在绘制的任何内容的最佳边界框。我可以有能力在这个框之外绘制(例如,如果ClipToBounds在比窗口更低的AdornerDecorator上为False ),但我不应该指望这种能力。
https://stackoverflow.com/questions/3401072
复制相似问题