在WPF中,如何在DataGrid顶部显示AdornerLayer
我正在使用codeplex的WPF数据网格。我正在使用DatagridTemplateColumn,并且我已经编写了datatemplates来显示每个列中的内容 现在,当datagrid中的任意控件处于焦点时,我必须向用户显示一些帮助消息。 为此,我考虑使用装饰层。我使用ComboBox加载事件并访问它的adrorner层。然后,我添加了我自己的装饰层,其中显示了一些类似于工具提示的内容。下面是代码在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
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);