La liaison à ActualHeight ne fonctionne pas
-
05-10-2019 - |
Question
J'ai essayé de créer un contrôle personnalisé, ayant un fond arrondi semi-transparent:
<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
, car ils ne sont pas ceux de dépendance.
Que faire pour mantenir le rectangle et de même taille textbox?
La solution
La liaison correcte consiste à utiliser ElementName
, non 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
, non?
Si cela est vraiment la façon dont vous voulez configurer votre contrôle, vous voulez lier la largeur du Rectangle
au TextBlock
du ActualWidth
et Height
à ActualHeight
.
UPDATE
Selon 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 Canvas
utiliser différents systèmes de mise en page , et puisque vous n'utilisez pas la fonctionnalité du Canvas
fournit, Grid
est le meilleur choix.
La grande différence entre les éléments de l'enfant est que le Rectangle
utilise maintenant seulement horizontale et VerticalAlignment
à Stretch
sur l'ensemble Grid
, au lieu de se soucier de la taille de quoi que ce soit.