2010-05-06 3 views
0

FindAncestor RelativeSource ne prend en charge que 'Self' et 'TemplatedParent', mais je dois lier la largeur d'un popup à la largeur de la page. Donner un nom à la page provoque des problèmes car, parfois, émet des exceptions indiquant qu'un contrôle avec ce nom est déjà présent dans l'arborescence visuelle.Alternative à FindAncestor RelativeSource dans Silverlight 4 pour lier à une propriété de la page

<Popup IsOpen="True" 
     Width="{Binding ElementName=BordPage, Path=Width}" 
     Height="{Binding ElementName=BordPage, Path=Height}"> 

Informations générales:

J'utilise une application de navigation SL4 ici. BordPage est une page de navigation, que j'utilise plusieurs fois dans l'application. Donc, en lui donnant un nom dans la page elle-même n'est pas vraiment une bonne idée, mais je ne sais pas comment je peux me lier à la largeur et la hauteur de la page. Ce que j'essaie de faire est d'avoir une bordure noire (avec l'opacité 0.8) couvrant l'écran entier, (y compris les contrôles de la MainPage). Ensuite, en plus de cela, je veux afficher d'autres contrôles.

Étant donné que l'application est contrôlée par contact, fournir à l'utilisateur une zone de liste déroulante pour sélectionner une valeur ne fonctionne pas vraiment. Au lieu de cela, je veux montrer cette fenêtre de superposition noire avec une liste déroulante occupant la plus grande partie de l'écran afin que l'utilisateur puisse simplement toucher la valeur qu'il souhaite en un seul clic.

Mise à jour: Je viens de réaliser que je peux utiliser la classe ChildWindow pour cela. Mais ma question originale demeure.

Répondre

1

Ma solution générale à ce problème consiste à écrire un comportement personnalisé. Ce n'est pas une pure solution XAML mais cela vous donne beaucoup plus de flexibilité.

Créez un comportement qui recherche l'objet VisualTree pour trouver le bon élément, puis définissez-le correctement sur la largeur de l'image contextuelle.

Cela peut être un peu plus compliqué qu'une liaison droite, mais cela évite tous les problèmes de nommage.

1

Mettez ce qui suit dans le constructeur de votre contrôle afin que vous puissiez éviter le nommer:

DataContext = this; 
Questions connexes