7
votes

WPF: Comment dessiner un cercle et glisser-la?

Je suis nouveau à WPF.

Je veux dessiner un petit cercle sur toile lorsque je cliquez sur la souris et être capable de glisser en douceur .

Comment puis-je accomplir cela?


0 commentaires

4 Réponses :


3
votes

"Peu importe ce qu'il s'agit", car la mise en place d'éléments dans WPF dépend fortement du conteneur parent. Il est facile de déplacer quelque chose 20px vers la droite à l'intérieur d'une toile (juste ajouter à Canvas.Left), mais il est beaucoup plus difficile de le faire dans une grille (vous devez traiter de colonne, de colonne et de marge).

Il existe un article de code décrivant comment faire glisser des éléments à l'intérieur d'une toile: glisser des éléments dans une toile

Si vous voulez déplacer simplement ce cercle et pas d'autres contrôles dans une toile / grille existante; Je vous suggère d'utiliser des dragcanvas (de l'article) comme une superposition sur la toile / grille normale.

comme pour la partie "Dessiner un cercle": utilisez simplement une ellipse comme élément à l'intérieur des dragcanvas.


1 commentaires

D'accord. J'utilise de toile et faites avec le dessin mais que le traînant est toujours un problème. Pouvez-vous fournir un petit extrait de code?



3
votes

Je définirais une toile et une ellipse dans le fichier xaml: xxx

avis que Canvas a l'attribut MouseDown = "Mousemovefunction" . Chaque fois que vous cliquez sur la toile, ce gestionnaire d'événements sera appelé. Si vous voulez qu'il se déplace lorsque votre souris se déplace, utilisez Mousemove = "Mousemovefunction"

Il suffit de mettre à jour la position d'Ellipse à chaque fois que vous déplacez votre souris. Le code suivant va dans la fonction appelée Evénements de souris: xxx


2 commentaires

FYI - Ce code dans la MouseMove ne fonctionne pas bien. Je mets le code dans mon application WPF et je l'ai débogué. Je peux voir chacune des lignes piétinées mais l'ellipse n'est jamais redessinée dans le nouvel emplacement. Y a-t-il un moyen d'appeler invalider () sur le canevas ou quelque chose? Pas sûr, mais cela ne fonctionne pas.


Remarque: Si la toile n'a pas de couleur de fond, MouseMove et clic ne vous y enregistreront pas. (Alors j'ai placé mon événement Mousemove à l'image derrière la toile invisible)



1
votes

J'ai pu faire tout cela en code, mais incapable de déplacer l'élément ellipse qui était un élément enfant de ma toile.

J'ai copié le code ci-dessous afin de pouvoir le reproduire.
Créez d'abord une application WPF appelée WPFExample et assurez-vous que votre formulaire principal a le suivant: p> xxx pré>

suivant, ajoutez le code à votre formulaire principal: p>

       private void Draw(Point m)
        {
            MainCanvas.Children.Clear();

            int mX = (int)m.X;
            int mY = (int)m.Y;
            Ellipse el = new Ellipse();
            el.Width = 15;
            el.Height = 15;
            el.SetValue(Canvas.LeftProperty, (Double)mX);
            el.SetValue(Canvas.TopProperty, (Double)mY);
            el.Fill = Brushes.Black;

            MainCanvas.Children.Add(el);
        }

        private void Canvas_MouseDown(object sender, MouseButtonEventArgs e)
        {
            Draw(e.GetPosition(MainCanvas));
        }

        private void MainCanvas_MouseMove(object sender, MouseEventArgs e)
        {
            Draw(e.GetPosition(MainCanvas));
        }


0 commentaires

0
votes

J'ai un exemple d'exemple de blog de glisser-déposer d'un rectangle dans un environnement WPF, mais en utilisant l'architecture MVVM. Les contenus sont trop longs pour reproduire ici, mais les instructions devraient être assez simples.

Il devrait également être assez simple de remplacer le rectangle par une ellipse ou d'autres formes de votre propre.

Drag and Drop Rectangle dans WPF / MVVM


0 commentaires