Wpf 我应该使用AdornerLayer来避免将我的装饰器从屏幕上剪掉吗?

Wpf 我应该使用AdornerLayer来避免将我的装饰器从屏幕上剪掉吗?,wpf,adorner,Wpf,Adorner,我正在编写一些涉及装饰器的WPF代码。我使用的是Josh Smith的UIElementAdorner.cs(在他的网站上的项目中找到)。我正在用信息文本的简介来装饰。我需要巧妙地放置我的装饰品,这样它就不会从屏幕上脱落 如果我要剪辑,最好的办法是什么 我使用以下代码创建并放置装饰器。我有一种奇怪的感觉,根据我是否会剪辑的视频不是最好的选择 var infoBubble = new InfoBubble {InformationText = @"I like cheese."}; var ado

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

如果我要剪辑,最好的办法是什么

我使用以下代码创建并放置装饰器。我有一种奇怪的感觉,根据我是否会剪辑的视频不是最好的选择

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
var infoBubble=newinfobubble{InformationText=@“我喜欢奶酪。”};
var adornedlementrect=new Rect(Target.DesiredSize);
var layer=AdornerLayer.GetAdornerLayer(目标);
var adorner=newuielementadorner(目标){Child=infoBubble};
装饰器尺寸(新尺寸(layer.ActualWidth,layer.ActualHeight));
var adornerRect=新的矩形(adorner.DesiredSize);
var top=-1*(adornerRect.高度);
var left=AdorneDeleteCenter.Width/2;
//使用图层判断装饰器的放置位置
var upperLeftPoint=Target.TranslatePoint(新点(左,上),层);
var lowerRightPoint=Target.TranslatePoint(新点(左+右)宽度,
顶部+装饰件高度),层);
如果(upperLeftPoint.Y<0)top-=upperLeftPoint.Y;//向下移动Y
如果(lowerRightPoint.X>layer.ActualWidth)
左-=(lowerRightPoint.X-layer.ActualWidth);//左移

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

是的,这是我能看到的最好的答案

根据进一步的阅读和一些实验,在调用GetAdornerLayer时,我们在可视化树中接收目标控件上方的最低层。这意味着我们可以在窗口模板中定义的层下面获得一个层。那个较低的AdorneDecorator可以有cliptobunds=“True”(我不知道为什么,但它可以)

了解这些信息后,我可以相对确定我正在绘制的装饰层是我正在绘制的任何东西的最佳边界框。我可以在这个框外画图(例如,如果低于窗口的AdornerDecorator上的ClipToBounds为False),但我不应该指望这个能力