我正在撰写一些涉及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元素之上时使用。因此,此代码对要装饰的元素或其环境知之甚少。
答案 0 :(得分:2)
是的,这是我能辨认的最佳答案。
根据进一步阅读和一些实验,当调用GetAdornerLayer时,我们会在可视树中收到目标控件上方的最低层。这意味着我们可以在Window模板中定义的AdornerDecorator图层下面获得一个图层。较低的AdornerDecorator可能有ClipToBounds =“True”(我不知道为什么,但它可以)。
了解这些信息后,我可以相对肯定我正在绘制的AdorneLayer是我绘制的最佳边界框。我可以在这个方框之外绘制(例如,如果AdornerDecorator上的ClipToBounds为False低于Window的值),但我不应该指望这个能力。