1

我有一个带有 a 的用户控件,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 使用用户控件:

<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吗?

4

2 回答 2

0

我认为它不起作用,因为无论您分配给 TestSendUiElement 什么DependencyProperty,它都不会成为VisualTree. 所以VisualTreeHelper.GetChildrenCount(...)行不通。

作为直接替代品,LogicalTreeHelper应该可以解决问题。

如果您知道对象的类型或 can ,那么最好使用公开的属性,如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 访问子项。AnItemsControl可能不像面板那么轻巧,但使用LogicalTreeHelper也可能不是最佳选择。取决于场景。

于 2010-10-19T12:48:09.170 回答
0

内容未初始化,因此在初始化时计算对象

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

你会得到计数2

于 2011-01-07T09:56:29.253 回答