我试图实现一种不寻常的 Adorner 用法。当鼠标悬停在 RichTextBox 上时,会在其上方出现一个 Adorner(见下图),允许您向 Adorner 中包含的 ListBox 添加字符串列表。这用于向所装饰元素中的“标签”(如 Flickr)添加标记。
首先:这样做是否可能?
大多数 Adorner 的示例均显示如何重写 Adorner 的 OnRender 方法来执行诸如绘制形状之类的琐碎操作。我能够使用此方法来呈现一组矩形,从而创建 Adorner 的灰色边框,该边框还会根据 RichTextBox 的高度调整大小,因为在 Adorner 显示时将添加额外的文本行。
protected override void OnRender(DrawingContext drawingContext)
{
SolidColorBrush grayBrush = new SolidColorBrush();
grayBrush.Color = Color.FromRgb(153, 153, 153);
// left
drawingContext.DrawRectangle(grayBrush, null, new System.Windows.Rect(1, 1, 5, ActualHeight));
// right
drawingContext.DrawRectangle(grayBrush, null, new System.Windows.Rect(ActualWidth - 6, 1, 5, ActualHeight));
//bottom
drawingContext.DrawRectangle(grayBrush, null, new System.Windows.Rect(1, ActualHeight, ActualWidth - 2, 5));
// for reasons unimportant to this example the top gray bar is rendered as part of the RichTextBox
}
然而,添加控件略微有些棘手。一般情况下,WPF的adorner需要在代码中添加子控件而不是XAML。使用DrawingContext adorner - possible to draw stackpanel?中描述的技术,我已经学会了如何在Adorner的初始化器中轻松地添加子控件(如TextBox)。
然而,问题在于如何在Adorner中放置这些控件。
如果我能够创建一个带有灰色背景并将其定位在Adorner底部的网格,那么我应该就可以继续进行了。 我会假设(希望)像根据添加标签更改大小的自动调整Adorner大小等事情都将自动发生。
简而言之,假设这是可能的,是否有人能推荐一种在Adorner内创建此较低的标记控件区域,并相对于Adorner底部定位它的方法(可能必须根据RichTextBox内容的大小调整大小)?