在WPF中,如何在DataGrid顶部显示AdornerLayer

在WPF中,如何在DataGrid顶部显示AdornerLayer,wpf,datagrid,z-order,adornerlayer,Wpf,Datagrid,Z Order,Adornerlayer,我正在使用codeplex的WPF数据网格。我正在使用DatagridTemplateColumn,并且我已经编写了datatemplates来显示每个列中的内容 现在,当datagrid中的任意控件处于焦点时,我必须向用户显示一些帮助消息。 为此,我考虑使用装饰层。我使用ComboBox加载事件并访问它的adrorner层。然后,我添加了我自己的装饰层,其中显示了一些类似于工具提示的内容。下面是代码 TextBox txtBox = (TextBox)comboBox.Temp

我正在使用codeplex的WPF数据网格。我正在使用DatagridTemplateColumn,并且我已经编写了datatemplates来显示每个列中的内容

现在,当datagrid中的任意控件处于焦点时,我必须向用户显示一些帮助消息。 为此,我考虑使用装饰层。我使用ComboBox加载事件并访问它的adrorner层。然后,我添加了我自己的装饰层,其中显示了一些类似于工具提示的内容。下面是代码

        TextBox txtBox = (TextBox)comboBox.Template.FindName("PART_EditableTextBox", comboBox);
        if (txtBox == null)
            return;

        txtBox.ToolTip = comboBox.ToolTip;
        AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(txtBox);
        Binding bind = new Binding("IsKeyboardFocused");
        bind.Converter = new KeyToVisibilityConverter();
        bind.Source = txtBox;
        bind.Mode = BindingMode.OneWay;
        PEAdornerControl adorner = new PEAdornerControl(txtBox);
        adorner.SetBinding(PEAdornerControl.VisibilityProperty, bind);
皮多纳层是这样的::

  public class PEAdornerControl : Adorner
  {
    Rect rect;

    // base class constructor.
    public PEAdornerControl(UIElement adornedElement)
        : base(adornedElement)
    { }

    protected override void OnRender(DrawingContext drawingContext)
    {
          .....
    }
  }
现在的问题如下。我附上了它在datagrid中的外观截图。如果datagrid有4行以上,则一切正常。下面是屏幕截图

如果datagrid的行数较少,则此装饰器将进入datagrid内部,并且对用户不可见。截图如下


如何在数据网格上获得此装饰层?请帮助我

我又看了一遍你的问题,我想这就是你需要的

    TextBox txtBox = (TextBox)comboBox.Template.FindName("PART_EditableTextBox", comboBox);
    if (txtBox == null)
        return;

    txtBox.ToolTip = comboBox.ToolTip;

    //this is locating the DataGrid that contains the textbox
    DataGrid parent = FindParent<DataGrid>(this);

    //Get the adorner for the parent
    AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(parent);
    Binding bind = new Binding("IsKeyboardFocused");
    bind.Converter = new KeyToVisibilityConverter();
    bind.Source = txtBox;
    bind.Mode = BindingMode.OneWay;
    PEAdornerControl adorner = new PEAdornerControl(txtBox);
    adorner.SetBinding(PEAdornerControl.VisibilityProperty, bind);

这段代码确实很粗糙,但应该为您指出正确的方向。查看文档页面,了解有关在面板中测量子元素的信息。

只需获取最顶层的
装饰层即可

    static AdornerLayer GetAdornerLayer(FrameworkElement adornedElement)
    {
        var w = Window.GetWindow(adornedElement);
        var vis = w.Content as Visual;

        return AdornerLayer.GetAdornerLayer(vis);
    }
此外,如果您有
DataGrid
的名称,则可以获取其上方最近的层:

AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(myDataGrid);

如果我没记错的话,不是装饰器进入了datagrid,而是datagrids的大小不够大,无法正确显示装饰器。这是由于父级的OnMesure方法未考虑adnorner层。您可能想考虑要么创建自己的父容器,要么考虑到这一点,要么(更可能)将附件添加到包含父插件的层中。但我真的很抱歉,我无法理解你在最后两行中想说什么。你可以发布一些示例代码,或者是一个可以帮助我理解的链接吗?
    static AdornerLayer GetAdornerLayer(FrameworkElement adornedElement)
    {
        var w = Window.GetWindow(adornedElement);
        var vis = w.Content as Visual;

        return AdornerLayer.GetAdornerLayer(vis);
    }
AdornerLayer myAdornerLayer = AdornerLayer.GetAdornerLayer(myDataGrid);