Отправка UIElements через DependencyProperty в wpf - PullRequest
1 голос
/ 14 октября 2010

У меня есть пользовательский элемент управления с DependencyProperty, который принимает UIElement.Пока все хорошо, проблема в том, что я не могу найти детей элемента.

Я думаю, что проблема заключается в моем незнании, может кто-нибудь сказать мне, в чем проблема и возможное решение?

Я создал небольшую тестовую программу, подобную этой

Код пользовательского контроля:

public UIElement TestSendUiElement
{
   get { return (StackPanel)GetValue(TestSendUiElementProperty); }
   set { SetValue(TestSendUiElementProperty, value); }
}

public static readonly DependencyProperty TestSendUiElementProperty =
 DependencyProperty.Register("TestSendUiElement", typeof(StackPanel), typeof(Test), new FrameworkPropertyMetadata(TestSendUiElementPropertyChanged));

private static void TestSendUiElementPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{
   Console.WriteLine(VisualTreeHelper.GetChildrenCount((UIElement)e.NewValue));
}

xaml, используя usercontrol:

<my:Test >
 <my:Test.TestSendUiElement>
  <StackPanel Orientation="Horizontal" Margin="0,2">
   <TextBox Height="23" Width="50" Margin="0,0,5,0" />
   <TextBox Height="23" Width="125" />
  </StackPanel>
 </my:Test.TestSendUiElement>
</my:Test>

Вывод: 0 детейРазве это не должно быть 2?

Ответы [ 2 ]

0 голосов
/ 07 января 2011

Содержимое не инициализировано, поэтому при инициализации подсчитайте объект

protected override void OnInitialized(EventArgs e)
{
   base.OnInitialized(e);
   Console.WriteLine(VisualTreeHelper.GetChildrenCount((UIElement)e.NewValue));
}

И вы получите счет 2

0 голосов
/ 19 октября 2010

Я думаю, что это не сработает, потому что, что бы вы ни присвоили TestSendUiElement DependencyProperty, оно не будет частью VisualTree. Так что VisualTreeHelper.GetChildrenCount(...) не будет работать.

В качестве прямой замены, LogicalTreeHelper должен добиться цели.

А если вы знаете тип объекта или можете, то еще лучше использовать открытые свойства, такие как ItemsControl.Items, ContentControl.Content и т. Д., За исключением классов, наследуемых от Panel (они LogicalChildren свойство внутреннее).

Если вы ленивый, вы можете сделать следующее (непроверенный код):

<my:Test.TestSendUiElement>
  <ItemsControl Margin="0,2">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <TextBox Height="23" Width="50" Margin="0,0,5,0" />
    <TextBox Height="23" Width="125" />
    <ItemsControl>
</my:Test.TestSendUiElement>

Затем вы меняете тип свойства DP на ItemsControl, и теперь вы можете получить доступ к дочерним элементам через this.TestSendUIElement.Items. ItemsControl, вероятно, не такой легкий, как панель, но использование LogicalTreeHelper, вероятно, также не будет оптимальным. Зависит от сценария.

...