Я снова посмотрел на ваш вопрос, и я думаю, что это то, что вам нужно.
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);
Метод поиска родительского элемента такой:
public T FindParent<T>(DependencyObject obj) where T : DepedencyObject
{
if (obj == null)
return null;
DependencyOBject parent = VisualTreeHelper.GetParent(obj);
if (parent is T)
return parent as T;
else
return FindParent<T>(parent);
}
Возможно, вам потребуется установитьположение вашего рекламодателя в методе OnRender, но это должно сработать.Однако следует учитывать, что если ваша DataGrid находится внутри другого контейнера (например, панели, сетки и т. Д.), Вы все равно можете столкнуться с проблемой отсечения.
Проблема отсечения связана с тем, что когдаКонтейнер проверяет компоновку своих дочерних элементов, которые он обычно не учитывает.Для борьбы с этим вам, возможно, потребуется создать свой собственный элемент управления и переопределить метод MeasuerOverride (ограничение размера).
Пример:
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 and add to return size as needed
}
return toReturn;
}
}
Этот код действительно груб для измерения, но должен указать вамв правильном направлении.Обратитесь к странице документации http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride.aspx для получения информации об измерении дочерних элементов на панели.