2010-09-15 6 views
1

J'essaie de superposer du contenu texte au-dessus d'une région décrite par un Path. Le Path est dans un ViewBox enveloppé Canvas afin qu'il puisse évoluer à n'importe quelle taille. Le TextBlock se trouve dans une grille enveloppée Canvas qui tente d'utiliser les cotes Path pour déterminer l'emplacement du bloc de texte.WPF: Comment accéder aux dimensions rendues d'un chemin en XAML?

<?xml version="1.0" encoding="UTF-8"?> 
<Canvas 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" Width="1299" Height="413"> 
    <ContentControl Width="300" Height="Auto"> 
     <Grid> 
      <Viewbox Stretch="Uniform" x:Name="MyViewBox"> 
       <Canvas Width="121.664" Height="79.158" x:Name="MyCanvas"> 
        <Canvas.LayoutTransform> 
         <TransformGroup> 
          <ScaleTransform ScaleX="1" ScaleY="1"/> 
         </TransformGroup> 
        </Canvas.LayoutTransform> 
        <Path x:Name="MyPath" Width="115.666" Height="54.334" Canvas.Left="2.998" Canvas.Top="3.086" Data="M 115.666015,46.333496 C 115.666015,50.733887 112.066406,54.333985 107.666015,54.333985 L 7.99999999999994,54.333985 C 3.59960900000004,54.333985 0,50.733887 0,46.333496 L 0,8 C 0,3.60058600000002 3.59960900000004,0 7.99999999999994,0 L 107.666015,0 C 112.066406,0 115.666015,3.60058600000002 115.666015,8 L 115.666015,46.333496 Z"> 
         <Path.Fill> 
          <SolidColorBrush Color="Red"/> 
         </Path.Fill> 
        </Path> 
       </Canvas> 
      </Viewbox> 
      <Canvas> 
       <Grid Width="115.666" Height="54.334" Canvas.Left="2.998" Canvas.Top="3.086" Margin="10,10"> 
        <Thumb/> 
        <TextBlock TextWrapping="Wrap"> 
        Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 
        </TextBlock> 
       </Grid> 
      </Canvas> 
     </Grid> 
    </ContentControl> 
</Canvas> 

Deux problèmes se posent. Premièrement, la Grille utilise les dimensions déclarées du Chemin, et non les dimensions finales rendues. De plus, si je mets le ScaleTransform.ScaleY à "-1" sur mon Canevas Path (pour refléter le chemin verticalement), le TextBlock ne se déplace pas vers les nouvelles positions de mon Path.

Est-il possible de le faire en XAML, ou devrais-je utiliser le code-behind pour lire l'emplacement lors de l'exécution?

EDIT: L'exemple Grid ne fait pas réellement référence aux propriétés Path, car je n'ai pas pu trouver les bonnes propriétés à référencer.

Répondre

0

Vous pouvez lier à la ActualWidth et ActualHeight de Path comme ci-dessous:

"{Binding ElementName=MyPath, Path=ActualHeight}" 

HTH

+0

Cela ne fonctionne pas vraiment. La propriété ActualHeight du chemin semble être la hauteur pré-mise à l'échelle, avant que la Viewbox ne l'étende. –

Questions connexes