2010-10-14 46 views
1

我有一個DependencyProperty用戶控件,需要UIElement。到目前爲止,這麼好,問題是我找不到元素的孩子。通過wpf中的DependencyProperty發送UIElements

我認爲問題是我缺乏知識,有誰能告訴我問題是什麼以及可能的解決方案嗎?

我做了一個小測試,這樣的程序

用戶控件代碼隱藏:使用用戶控件

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

回答

0

內容沒有初始化,因此指望初始化

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

的對象,你會得到數2條

0

我認爲它不起作用,因爲無論您分配給TestSendUiElement DependencyProperty,它都不會成爲VisualTree的一部分。所以VisualTreeHelper.GetChildrenCount(...)將無法​​正常工作。

作爲一個直接替代,LogicalTreeHelper應該做的伎倆。

如果你知道對象的類型,還是可以的,那麼它甚至更好用暴露的屬性,如ItemsControl.ItemsContentControl.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訪問的孩子。項目。 ItemsControl可能不像面板那麼輕,但使用LogicalTreeHelper可能也不是最優的。取決於場景。

+0

LogicalTreeHelper接縫是在我的情況的最佳途徑。但是,當我厭倦這個我只得到這個輸出:System.Windows.LogicalTreeHelper + EnumeratorWrapper。 所以我沒有得到任何孩子,我可以通過循環。我應該得到孩子嗎? – Cinaird 2010-10-20 14:02:31