2017-05-28 1 views
0

Je dois dessiner un cercle dans une grille. Cette grille doit s'adapter proportionnellement à la hauteur et à la largeur définies par la définition Column/Row de sa grille parente. Maintenant, si je mets un étirement, il remplira tout l'espace et deviendra une ellipse alors que je veux que ce soit un cercle.C# WPF comment dessiner un cercle qui s'étend pour remplir son parent et reste un cercle dans le code derrière

Ok bref la grille mère adapte proportionnellement comme enter image description here

puis dans une routine ajouter le code suivant:

public void RadialPercentage(Grid grd) 
{ 
    Ellipse elpExt = new Ellipse(); 
    elpExt.Stroke = Brushes.Green; 
    elpExt.StrokeThickness = 4; 
    //elpExt.Margin = new Thickness(0); 
    //elpExt.HorizontalAlignment = HorizontalAlignment.Center; 
    elpExt.VerticalAlignment = VerticalAlignment.Stretch; 
    grd.Children.Add(elpExt); 

    Ellipse elpInt = new Ellipse(); 
    elpInt.Stroke = Brushes.Blue; 
    elpInt.StrokeThickness = 4; 
    elpInt.Margin = new Thickness(20); 
    //elpInt.Width = elpInt.Height = dim-20; 
    //elpInt.HorizontalAlignment = HorizontalAlignment.Center; 
    elpInt.VerticalAlignment = VerticalAlignment.Stretch; 
    grd.Children.Add(elpInt); 
    return; 
} 

mais l'effet est le suivant:

enter image description here

donc il s'étend à la fois verticalement et horizontalement même si je ne mets que le verticale et non la contrainte horizontale. Si je le place au centre, l'ellipse s'effondre.

Pour résoudre le problème même si je ne suis pas sûr que ce soit la bonne chose à faire j'ai essayé de regarder le poids/la hauteur de la grille parente mais évidemment ces valeurs et les valeurs réelles sont mises à zéro.

Merci de nous aider Patrick

+0

Avoir un coup d'oeil à [** ** extensible] (https://msdn.microsoft.com/en-us/library/system.windows.shapes.shape.stretch (v = vs.110) .aspx) ... – elgonzo

Répondre

2

Qu'en est-réglage de Width de » liant à ActualHeight de l'ellipse et mis HorizontalAlignment-Center? Quelque chose comme ceci:

var ellipse = new Ellipse(); 

var binding = new Binding(Ellipse.ActualHeightProperty.Name) 
{ 
    RelativeSource = new RelativeSource(RelativeSourceMode.Self), 
    Mode = BindingMode.OneWay 
}; 

ellipse.VerticalAlignment = VerticalAlignment.Stretch; 
ellipse.HorizontalAlignment = HorizontalAlignment.Center; 

BindingOperations.SetBinding(ellipse, Ellipse.WidthProperty, binding); 
+0

Et si la hauteur de la cellule est supérieure à sa largeur? .... – elgonzo

+0

Oui cela pourrait théoriquement être mais pas dans mon cas. Merci beaucoup Maxim !! – Patrick

+0

@elgonzo Alors ma solution ne marchera pas. Mais l'utilisation de 'Stretch.Uniform' ne fonctionnera pas dans le cas où' HorizontalAlignment' ou 'VerticalAlignment' est' Center' donc ce n'est pas une solution universelle aussi. – Maxim