2010-09-24 5 views
2

J'ai essayé de créer un contrôle personnalisé, ayant un fond arrondi semi-transparent:Reliure à ActualHeight ne fonctionne pas

<Canvas> 
    <TextBlock x:Name="StopText" Text="Some test text"/> 
    <Rectangle Fill="SkyBlue" 
       Width="{Binding Source=StopText, Path=ActualHeight}" 
       Height="20" 
       RadiusX="5" RadiusY="5" Opacity="0.2"/> 
</Canvas> 

Le problème est que je ne peux pas, sans doute, se lient aux propriétés ActualHeight/ActualWidth, la cause ce ne sont pas des dépendances. Que faire pour conserver le rectangle et la zone de texte de la même taille?

Répondre

10

est d'utiliser la liaison correcte ElementName, pas Source, lors de la liaison à un autre élément:

<Canvas> 
    <TextBlock x:Name="StopText" Text="Some test text"/> 
    <Rectangle Fill="SkyBlue" 
       Width="{Binding ElementName=StopText, Path=ActualHeight}" 
       Height="20" 
       RadiusX="5" RadiusY="5" Opacity="0.2"/> 
</Canvas> 

En outre, vous vous rendez compte que vous liez la largeur de la Rectangle au Height du TextBlock, droit ?

Si cela est vraiment la façon dont vous voulez configurer votre contrôle, vous voulez lier le RectangleActualWidth de Largeur de la TextBlock ', et Height-ActualHeight.

MISE À JOUR par les commentaires ci-dessous, voici une mise en œuvre en utilisant un Grid sans liant:

<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
    <TextBlock x:Name="StopText" Text="Some test text"/> 
    <Rectangle Fill="SkyBlue" 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Stretch" 
       RadiusX="5" RadiusY="5" Opacity="0.2"/> 
</Grid> 

Grid et Canvasuse different layout systems, et puisque vous n'utilisez pas la fonctionnalité du Canvas fournit, Grid est le meilleur choix.

La grande différence dans les éléments de l'enfant est que le Rectangle utilise maintenant seulement horizontale et VerticalAlignment-Stretch à travers le Grid entier, au lieu de se soucier de la taille de quoi que ce soit.

+0

Bonne observation à propos de ElementName. Que faire si je voudrais le lier au canevas lui-même (l'élément principal de UserControl). Que dois-je définir? – serhio

+0

Je voudrais simplement utiliser une grille au lieu d'un canevas, et vous n'avez pas besoin de liaison du tout. Je vais mettre à jour ma réponse. –

+0

Hmm ... Avec Canvas, j'ai utilisé 'this.SetValue (Canvas.LeftProperty' pour définir l'emplacement de UserControl (à l'intérieur de UserControl) Comment puis-je faire maintenant, avec la Grille? – serhio