web-dev-qa-db-fra.com

Changer la position d'un élément par programme dans WPF

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!

19
azamsharp

Voici la réponse: 

Canvas.SetLeft(ellipse,GetRandomValue());
Canvas.SetTop(ellipse,GetRandomValue());
25
azamsharp

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.

14
Ray

Le code ci-dessous fonctionne:

ellipse.SetValue(Canvas.LeftProperty,100.0);
ellipse.SetValue(Canvas.TopProperty,100.0);

Les valeurs sont du type double.

8
AndyW360

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

0
George Birbilis

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.