2010-09-10 4 views
2

J'ai un point sur une toile que je veux placer une ellipse. Je veux que le centre de l'ellipse soit sur ce point. En ce moment, le bord supérieur gauche de l'ellipse est sur ce point.Positionnement d'un élément WPF sur une toile

Je sais que je peux déplacer l'ellipse par programmation sur la toile mais je me demandais s'il y avait un moyen de dire à WPF de centrer l'élément sur le point au lieu de le dimensionner en haut à gauche ???

Répondre

7

Je ne connais aucune fonctionnalité intégrée dans Ellipse pour définir son centre sur un point, mais vous pouvez étendre la classe Ellipse pour le faire.

Ajouter cette classe au projet

public static class EllipseX 
{ 
    public static void SetCenter(this Ellipse ellipse, double X, double Y) 
    { 
     Canvas.SetTop(ellipse, Y - ellipse.Height/2); 
     Canvas.SetLeft(ellipse, X - ellipse.Width/2); 
    } 
} 

Puis en XAML créer la Ellipse

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Canvas Background="LightGray"> 
     <Ellipse  
      Name="myEllipse"  
      Fill="Red" 
      Height="75" 
      Width="75" 
     /> 
    </Canvas> 
</Window> 

ensuite écrire int code suivant dans le code derrière:

myEllipse.SetCenter(200,200); 

L'avantage est que vous n'avez pas à répéter la logique de trouver le centre dans chaque ellipse que vous créez.

Espérons que cela aide.

+0

Cela peut être pris un peu plus loin en utilisant la forme à la place d'Ellipse dans la méthode d'extension. 'public static void SetCenter (cette forme s, double X, double Y) {...}' –

0

Non, il n'y en a pas. En haut à gauche est en haut à gauche, car c'est en haut à gauche :). Sinon, au lieu de déplacer l'ellipse, vous pouvez changer de point si vous connaissez les dimensions de l'ellipse.

0

Vous pouvez appliquer un TranslateTransform à l'Ellipse, mais cela nécessite que vous connaissiez sa largeur et sa hauteur.

0

J'ai rencontré un problème similaire en définissant le Centre d'une ScaleTransform dans un style de contrôles de tailles différentes. Terminé en utilisant un convertisseur pour lier à l'ActualWidth/ActualHeight divisé par 2. La même chose devrait fonctionner pour vous avec un TranslateTransform comme Rune Grimstad mentionné.

<ScaleTransform CenterX="{Binding ActualWidth, Converter={StaticResource divisionConverter}}" 
       CenterY="{Binding ActualHeight, Converter={StaticResource divisionConverter}}" 
       ScaleX="1.2" 
       ScaleY="1.2" />