В визуальном дереве отсутствует вложенный элемент в пользовательском элементе управления - PullRequest
1 голос
/ 06 сентября 2011

У меня две проблемы с пользовательскими элементами управления:

Я создал пользовательский элемент управления UserControl

public partial class MyControl : UserControl
{
public static DependencyProperty ControlProperty = DependencyProperty.Register("Control", typeof(UIElement), typeof(MyControl ), null);

 public UIElement Control
        {
            get { return GetValue(ControlProperty) as UIElement; }
            set { SetValue(ControlProperty,value); }
        }
}

Теперь я хочу встроить любой «обычный» элемент управления в свой элемент управления с помощью XAML

<Grid>
<own:MyControl>
<own:MyControl.Control>
<TextBox x:Name="txtTest" />
</own:MyControl.Control>
</own:MyControl>  
</Grid>

1) При попытке получить доступ к TextBox по его имени в коде позади, я просто не могу, потому что он нулевой.В чем может быть проблема?Если бы я поместил тот же TextBox прямо в Grid, имя было бы разрешено для экземпляра, как и должно быть.

2) Я не могу найти свой класс с помощью VisualTreeHelper.Метод GetChild просто делает вид, что моего контроля нет.Почему это происходит?

Заранее спасибо!

1 Ответ

1 голос
/ 06 сентября 2011

VisualTreeHelper вовсе не «притворяется». Значением свойства MyControl.Control является , а не в дереве визуалов. Просто присутствие в Xaml не означает, что оно будет добавлено в визуальное дерево.

Только когда элемент управления добавляется в качестве дочернего элемента элемента пользовательского интерфейса, который уже находится в дереве визуалов, например Panel, ContentControl или Border, он также станет частью визуального дерева.

Вы можете сделать это: -

<Grid>
  <own:MyControl x:Name="myControl">
    <own:MyControl.Control>
      <TextBox x:Name="txtTest" />
    </own:MyControl.Control>
  </own:MyControl>  
</Grid>

В коде позади: -

txtTest = myControl.Control as TextBox;

Возможно, это не то, что вы пытаетесь сделать, так что же вы пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...