通过Wpf中的DependencyProperty发送UIElements

时间:2010-10-14 06:49:37

标签: wpf .net-4.0 wpf-controls dependency-properties uielement

我有一个DependencyProperty的用户控件,需要UIElement。到目前为止,这么好,问题是我找不到元素的孩子。

我认为问题在于我缺乏知识,有人能告诉我问题是什么以及可能的解决方案吗?

我做了一个像这样的小测试程序

Usercontrol codebehind:

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));
}

使用usercontrol的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?

2 个答案:

答案 0 :(得分:0)

我认为它不起作用,因为无论你分配给TestSendUiElement DependencyProperty,它都不会成为VisualTree的一部分。因此VisualTreeHelper.GetChildrenCount(...)无效。

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

如果您知道对象的类型或者可以,那么使用ItemsControl.ItemsContentControl.Content等公开属性会更好,但继承自{{1}的类除外}(他们的LogicalChildren属性是内部的。)

如果你很懒,你也可以做以下(未经测试的代码):

Panel

然后将DP属性的类型更改为<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> ,现在您可以通过this.TestSendUIElement.Items访问子项。 ItemsControl可能不像面板那样轻量级,但使用ItemsControl可能也不是最佳选择。取决于场景。

答案 1 :(得分:0)

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

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

你会得到数2