2010-12-02 4 views
4

Dans mon projet WPF, j'ai un contrôle un peu complexe. Dans le projet, j'utilise uniquement des contrôles (ils sont tous basés sur des modèles), en plus de MainWindow.Impossible de trouver le parent d'un contrôle basé sur un modèle par type (!) (Wpf)

Sur un écran, j'ai la disposition suivante (pour montrer la mise en page après modèles ont été appliqués et le contenu rempli):

MyScreenControl
-MyTableControl
--ItemsControl
--- HeaderItemsControl
- ---- ------ HeaderItemsControl.Header
MyHeaderControl
HeaderItemsControl.Items ----- ------
MyItemControl
------ MyItemC ontrôle
------ MyItemControl
...

Quand je suis dans le fichier de code de ScreenControl, dans la méthode OnMouseLeftButtonDown je voudrais savoir si l'événement de clic est venu d'un MyHeaderControl ou un MyItemControl .

La source de MouseButtonEventArgs est ScreenControl et OriginalSource est le TextBlock du modèle MyItemControl/MyHeaderControl.

Ma première tentative pour trouver le MyItemControl/MyHeaderControl devait commencer à partir de OriginalSource et regarder récursivement le type de la propriété Parent. Cela fonctionne bien jusqu'à ce que j'arrive à la racine du Template (qui est dans ce cas une ViewBox), mais la racine n'a pas d'élément Parent.

Je l'ai utilisé une méthode comme celui-ci dans az projet antérieur à moi et cela a fonctionné, mais je travaillais avec UserControls, pas de contrôles, ni modèles.

Toute idée comment dois-je aborder ce problème (une bonne idée est aussi Wellcome comme code)?

thx, Tenshiko

+0

Parfois, il peut être utile de chercher les parents, et non que l'enfant ait été chargé. Par exemple, vous pouvez utiliser l'événement yourChild.Loaded – peter70

Répondre

4

Avez-vous simplement essayé d'obtenir TemplatedParent du OriginalSource? :

Control originalSource = e.OriginalSource; 

MyItemControl myItemControl = originalSource.TemplatedParent as MyItemControl; 
MyHeaderControl myHeaderControl = originalSource.TemplatedParent as MyHeaderControl; 

if (MyItemControl != null) .... 
else if (MyHeaderControl != null) .... 

(voir: http://msdn.microsoft.com/en-gb/library/system.windows.frameworkelement.templatedparent.aspx)

+0

OMG c'est tout! THX! – Tenshiko

+0

vous êtes les bienvenus :) (J'ai ressenti l'enthousiasme) – David

2

Check out VisualTreeHelper.GetParent, qui vous permettra de marcher l'arbre visuel où les contrôles ont été effectivement instancié par le modèle.

+0

Il fait la même chose. Selon GetParent() mon contrôle ressemble à: – Tenshiko

+0

grid-grid-textblock au lieu de control-grid-grid-textblock – Tenshiko

Questions connexes