2010-10-14 29 views
1

J'ai un contrôle utilisateur avec un DependencyProperty qui prend un UIElement. Jusqu'à présent, tout va bien, le problème est que je ne peux pas trouver les enfants de l'élément.Envoyer UIElements via DependencyProperty dans wpf

Je pense que le problème est mon manque de connaissances, quelqu'un pourrait-il me dire quel est le problème et une solution possible?

J'ai fait un petit programme de test comme celui-ci

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

XAML en utilisant la 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> 

sortie est 0 enfants. Ne devrait-il pas être 2?

Répondre

0

Le contenu est pas initialisés compte donc l'objet lors de l'initialisation

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

Et vous obtiendrez compter 2

0

Je pense que cela ne fonctionne pas parce que tout ce que vous affectez à la TestSendUiElement DependencyProperty, il ne fera pas partie de la VisualTree. Donc, VisualTreeHelper.GetChildrenCount(...) ne fonctionnera pas. En remplacement direct LogicalTreeHelper devrait faire l'affaire.

Et si vous connaissez le type de l'objet ou peut, alors il est encore préférable d'utiliser les propriétés exposées comme ItemsControl.Items, etc. ContentControl.Content et, à l'exception des classes héritant de Panel (ils sont la propriété LogicalChildren est interne).

Si vous êtes paresseux, vous pouvez aussi faire le (code non testé) suivant:

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

Ensuite, vous modifiez le type de la propriété DP à ItemsControl, et vous pouvez désormais accéder aux enfants via this.TestSendUIElement. Articles. Un ItemsControl n'est probablement pas aussi léger qu'un panneau, mais l'utilisation du LogicalTreeHelper ne serait probablement pas optimale non plus. Cela dépend du scénario.

+0

coutures LogicalTreeHelper être la meilleure façon dans mon cas. Mais quand je me fatigue, je n'ai que cette sortie: System.Windows.LogicalTreeHelper + EnumeratorWrapper. Donc, je ne reçois pas d'enfants que je peux traverser. Devrais-je avoir des enfants? – Cinaird