2010-08-19 6 views
0

Je suis perplexe face à un problème que j'éprouve en utilisant ScaleTransform. J'ai une grille avec une largeur et une hauteur fixes. La grille contient un enfant, un rectangle. Le remplissage du rectangle est un VisualBrush dont le visuel se lie à une toile en dehors de la grille, dont les dimensions sont plutôt grandes. Sur le rectangle, j'utilise un ScaleTransform, avec ScaleX et ScaleY étant tous les deux mis à 0.18. Essentiellement, j'essaie de redimensionner le visuel du Rectangle pour qu'il corresponde à ma grille. Ce qui semble se passer, c'est que la grille elle-même est réduite, ce qui entraîne un résultat beaucoup plus faible que ce que je veux. J'ai inclus le code ci-dessous. Juste comme point de référence, la hauteur et la largeur que le rectangle attache sont essentiellement 900 par 600, respectivement. Toute indication sur ce que je pourrais faire de mal serait grandement appréciée.WPF Scaling Version

<Grid Height="225" Width="200" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" x:Name="PART_Content"> 
      <Rectangle Height="{Binding Path=ActualHeight}" Width="{Binding Path=ActualWidth}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
       <Rectangle.Fill> 
        <VisualBrush Visual="{Binding}"/> 
       </Rectangle.Fill> 
       <Rectangle.RenderTransform> 
        <ScaleTransform ScaleX="0.183" ScaleY="0.183"/> 
       </Rectangle.RenderTransform> 
      </Rectangle> 
     </Grid> 

Répondre

0

Pouvez-vous publier le code XAML pour l'élément Canvas? J'ai essayé ce qui suit et j'obtenir le comportement que vous allez pour (le rectangle est mis à l'échelle et la grille est dimensionnée correctement)

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 

     <Grid ShowGridLines="True" Height="225" Width="200" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" x:Name="PART_Content"> 
      <Rectangle Height="{Binding Path=ActualHeight}" Width="{Binding Path=ActualWidth}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
       <Rectangle.Fill> 
        <VisualBrush Visual="{Binding ElementName=theCanvas}"/> 
       </Rectangle.Fill> 
       <Rectangle.RenderTransform> 
        <ScaleTransform ScaleX="0.183" ScaleY="0.183"/> 
       </Rectangle.RenderTransform> 
      </Rectangle> 
     </Grid> 

     <Canvas x:Name="theCanvas" Grid.Row="1"> 
      <Rectangle Fill="Brown" Height="300" Width="300" /> 

     </Canvas> 
    </Grid> 
0

Qu'est-ce ActualWidth et ActualHeight? À moins que je ne me trompe les propriétés ActualHeight et ActualWidth car elles signifient normalement dans WPF ne sont pas DP et vous ne pouvez pas les lier . Comme cela a été indiqué ci-dessous, il s'agit de propriétés de dépendance en lecture seule. En supposant que ce soit dans un style CustomControl, la liaison doit d'abord être modifiée en TemplateBinding.

J'ai supprimé les liaisons et créé essentiellement une version statique de votre XAML qui semble très bien. Puisque vous avez défini Part_Content pour la grille, je suis curieux, est-ce que xaml fait partie d'un style de contrôle personnalisé? Le code du CustomControl manipule-t-il la grille via PART_Content?

<Grid Height="225" Width="200" Grid.Row="0" HorizontalAlignment="Left" VerticalAlignment="Top" x:Name="PART_Content" Background="Red"> 
<Rectangle Height="225" 
      Width="200" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch" 
      Fill="Blue"> 

      <Rectangle.RenderTransform> 
       <ScaleTransform ScaleX="0.183" ScaleY="0.183"/> 
      </Rectangle.RenderTransform> 
     </Rectangle> 
    </Grid> 
+0

ActualHeight et ActualWidth sont en lecture seule DependencyProperties. Il n'y a aucune raison que vous ne puissiez pas les utiliser comme source de liaison comme le fait Chris - Source peut être n'importe quelle propriété CLR. C'est seulement la cible qui doit être un DP. Dans ce cas, vous ne pouvez pas affecter une valeur à l'un d'entre eux car ils sont en lecture seule et ne peuvent donc pas être utilisés comme cible. –

+0

"Source peut être n'importe quelle propriété CLR" * mais * pour que la liaison ait du sens, elle doit être sauvegardée par INotifyPropertyChanged. Cela dit, j'ai dit que je pourrais me tromper que ce ne sont pas des DP. Franchement, je trouve ce code très étrange. Si en effet il veut se lier à ActualHeight et à ActualWidth il devrait utiliser TemplateBinding et non Binding. Vous utilisez la liaison lorsque vous souhaitez lier à quelque chose dans le datacontext et je suis assez certain qu'il n'a pas ActualHeight/Width dans sa VM. – NVM

Questions connexes