In WPF, how to display AdornerLayer on top of DataGrid -
i using wpf datagrid codeplex. using datagridtemplatecolumn , have written datatemplates display contents in each column.
now have display message user when control in datagrid focussed. thought of using adorner layer. used combobox loaded event , accessed adrorner layer of it. added own adorner layer thing displayed there similar tooltip. below code.
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); peadorner layer ::
public class peadornercontrol : adorner { rect rect; // base class constructor. public peadornercontrol(uielement adornedelement) : base(adornedelement) { } protected override void onrender(drawingcontext drawingcontext) { ..... } } now problem follows. attaching screenshot of how looking in datagrid. if datagrid has more 4 rows, things fine.below screenshot

if datagrid has less number of row, adorner goes inside datagrid , not visible user. screenshot below 
how adorner layer above datagrid? please me !!!
i looked @ question again , think need.
textbox txtbox = (textbox)combobox.template.findname("part_editabletextbox", combobox); if (txtbox == null) return; txtbox.tooltip = combobox.tooltip; //this locating datagrid contains textbox datagrid parent = findparent<datagrid>(this); //get adorner 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); the find parent method this:
public t findparent<t>(dependencyobject obj) t : depedencyobject { if (obj == null) return null; dependencyobject parent = visualtreehelper.getparent(obj); if (parent t) return parent t; else return findparent<t>(parent); } you may need set position of adorner in onrender method should work. 1 thing consider though if datagrid within container (such panel, grid, etc) may still run clipping problem.
the clipping problem due fact when container checks layout of children not take account adorners. combat possibly need create own control , override measueroverride(size constraint) method.
example:
public class mypanel : panel { protected override size measureoverride(size constraint) { size toreturn = new size(); foreach (uielement child in this.internalchildren) { //do normal measuring of children foreach( uielement achild in adornerlayer.getadorners(child)) //measure child adorners , add return size needed } return toreturn; } } that code rough measure should point in right direction. @ documentation page http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride.aspx information measuring child elements in panel.
Comments
Post a Comment