我有一个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?
答案 0 :(得分:0)
我认为它不起作用,因为无论你分配给TestSendUiElement DependencyProperty
,它都不会成为VisualTree
的一部分。因此VisualTreeHelper.GetChildrenCount(...)
无效。
作为直接替代,LogicalTreeHelper
应该可以解决问题。
如果您知道对象的类型或者可以,那么使用ItemsControl.Items
,ContentControl.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