Je ne savais pas que cette chose simple serait un peu compliquée. J'ai une toile dans laquelle j'essaie d'ajouter Ellipse de manière dynamique. Voici le code:
<StackPanel>
<Canvas Name="canvas" Background="LightBlue" Margin="5" Width="250" Height="250">
</Canvas>
<Button Content="Draw Images" Click="Button_Click" Width="100" Margin="10" />
</StackPanel>
Et voici le code derrière:
private void Button_Click(object sender, RoutedEventArgs e)
{
Ellipse ellipse = new Ellipse();
ellipse.Fill = Brushes.Red;
ellipse.Width = 10;
ellipse.Height = 10;
ellipse.SetValue(Canvas.LeftProperty,100);
ellipse.SetValue(Canvas.TopProperty,100);
canvas.Children.Add(ellipse);
}
Pour une raison quelconque, il lève l'exception que 100 n'est pas une valeur valide!
Voici la réponse:
Canvas.SetLeft(ellipse,GetRandomValue());
Canvas.SetTop(ellipse,GetRandomValue());
La raison pour laquelle 100
ne fonctionne pas est que SetValue()
l'interprète comme un entier, mais Canvas.Top
et Canvas.Left
sont des doubles. Essayez 100d
à la place. De plus, SetLeft()
& SetTop()
fonctionnent car ils attendent des doublons.
Le code ci-dessous fonctionne:
ellipse.SetValue(Canvas.LeftProperty,100.0);
ellipse.SetValue(Canvas.TopProperty,100.0);
Les valeurs sont du type double.
Left et Top sont des propriétés attachées appartenant à la classe Canvas, que vous pouvez associer à tout objet DependencyObject, qu'il s'agisse d'un FrameworkElement ou non et qu'il soit hébergé dans un canevas.
C'est pourquoi vous devez utiliser:
myDependencyObject.SetValue (Canvas.LeftProperty, leftValue); myDependencyObject.SetValue (Canvas.TopProperty, topValue);
Dans la plupart des autres conteneurs, la grille ignorera simplement ces valeurs de propriété si notre objet de dépendance est un FrameworkElement contenu dans celles-ci plutôt que dans un canevas. On pourrait faire si d'autres conteneurs qui respectent ces propriétés
si vous voulez déplacer votre toile avec la matrice, procédez comme suit:
<Canvas Name="mcanvas" >
<Canvas.RenderTransform>
<MatrixTransform x:Name="mt"/>
</Canvas.RenderTransform>
</Canvas>
alors vous pouvez faire tous les travaux que vous voulez, sur Matrix "mt". Comme ça :
Pour l'échelle:
Matrix matrix = new Matrix();
matrix.Scale(1.5, 1.5);
mt.Matrix = matrix;
mcanvas.LayoutTransform = Transform.Identity;
Pour traduire (changement de position):
Matrix matrix = new Matrix();
matrix.Translate(50, 0);
mt.Matrix = matrix;
mcanvas.LayoutTransform = Transform.Identity;
Et si vous voulez créer un élément de toile par programme, procédez comme suit:
Ellipse el = new Ellipse();
Matrix matrix = new Matrix();
matrix.Translate(50, 0);
matrix.Scale(1.5,1.5);
el.RenderTransform = new MatrixTransform(matrix);
J'espère que cela vous aide.