2009-03-26 5 views
1

J'ai une bordure avec des coins arrondis dans un canevas et je souhaite ajouter une zone de découpage au canevas de sorte que tout ce que j'ajoute soit coupé à la zone dans la bordure. Je sais que je peux définir la propriété Clip de la toile, mais comme le canevas et l'objet sont dimensionnés dynamiquement plutôt que d'avoir des tailles assignées dans le XAML, je n'arrive pas à comprendre comment calculer le chemin à utiliser. Est-il possible de dériver un PathGeometry à partir d'un UIElement (la frontière dans ce cas)? Sinon, quelle est la meilleure façon d'aborder cela? Voici le XAML pour la page de test avec laquelle je travaille.Détermination dynamique du chemin dans Silverlight 2

<UserControl x:Class="TimelinePrototype.Page" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<Grid x:Name="LayoutRoot"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <StackPanel Orientation="Horizontal" Margin="10"> 
     <Button x:Name="cmdDraw" FontSize="18" Click="cmdDraw_Click" Content="Draw" Margin="0,0,5,0" VerticalAlignment="Bottom" /> 
     <TextBlock x:Name="txtDateRange" FontSize="18" Margin="10,0,10,10" VerticalAlignment="Bottom" /> 
    </StackPanel> 
    <Canvas x:Name="TimelineCanvas" Grid.Row="1" HorizontalAlignment="Stretch" 
       SizeChanged="TimelineCanvas_SizeChanged"> 
     <Border x:Name="TimelineBorder" 
       Background="LightGray" 
       BorderBrush="Black" 
       BorderThickness="2" 
       CornerRadius="15" 
       Margin="10" 
       Grid.Row="1" 
       VerticalAlignment="Top"> 
     </Border> 
    </Canvas> 
</Grid> 

Répondre

1

Essayez d'utiliser les ActualHeight et ActualWidth propriétés

var height = TimelineCanvas.ActualHeight; 
var width = TimelineCanvas.ActualWidth; 
+0

J'avais pensé à utiliser ceux-ci mais je me demandais s'il y aurait une autre façon, plus intelligente, de le faire. –

0

J'ai fini en utilisant ce code, mais serait toujours intéressé par des méthodes alternatives.

RectangleGeometry clipRect = new RectangleGeometry(); 
clipRect.Rect = new Rect(TimelineBorder.Margin.Left, TimelineBorder.Margin.Top, TimelineCanvas.ActualWidth - (TimelineBorder.Margin.Left + TimelineBorder.Margin.Right), TimelineCanvas.ActualHeight - (TimelineBorder.Margin.Top + TimelineBorder.Margin.Bottom)); 
clipRect.RadiusX = TimelineBorder.CornerRadius.TopLeft; 
clipRect.RadiusY = TimelineBorder.CornerRadius.TopLeft; 
TimelineCanvas.Clip = clipRect; 
+0

Je devrais endosser cette méthode; si seulement parce que je l'ai fait de cette façon des dizaines de fois sans voir une approche plus agréable. – MojoFilter

0

Essayez blacklight

Le toolpack Blacklight dispose d'un outil de découpage de coin arrondi et est libre.

+0

Merci, je vais vérifier. –

Questions connexes