11
votes

Comment permettre à l'utilisateur de faire glisser un contrôle créé de manière dynamique à l'emplacement de son choix

Je crée une application dans laquelle j'ai besoin de générer des contrôles créés de manière dynamique, disons une zone de texte ou une étiquette, etc.

Maintenant ce que l'utilisateur peut déplacer cette zone de texte à son emplacement souhaité. Comme nous faisons dans Visual Studio. Une solution est d'obtenir un nouvel emplacement en obtenant des valeurs de lui à l'aide de la zone de texte. Mais je veux facilement l'interface utilisateur.

pouvons-nous avoir une telle fonctionnalité dans Winforms


2 commentaires

Oui, mais vous devrez travailler dur à cela.


@Slaks: Pouvez-vous me diriger un peu. Je peux donner autant de temps que nécessaire. J'ai eu ce problème à résoudre dans mon travail, mais nous avons convaincu que notre client est impossible. Mais je sais que c'est possible alors je veux le faire chez moi. S'il vous plaît laissez-moi savoir où commencer avec ça.


3 Réponses :


1
votes

Vous pouvez appeler dodragdrop avec un objet de données contenant ou représentant la commande pour lancer une opération de glisser-déposer, puis gérez l'événement dragdrop et déplacez le contrôle.

Si vous voulez voir le contrôle tel qu'il est glissé, vous pouvez créer un formulaire transparent (gérer wm_nchittest ) sous la souris indiquant le contrôle (appel drawtobitmap ), Ou n'utilisez pas le glisser-déposer du tout et manipuler manuellement les événements de la souris et la piste manuellement.

Si vous souhaitez des instantanmes de style Visual Studio, vous pouvez comparer les limites de la commande à d'autres commandes, créer un ensemble de lignes à dessiner et les dessiner dans un événement de peinture.


4 commentaires

Je peux voir sur des événements de contrôle du panneau et des boutons. Ils n'ont pas d'événement / une propriété dodragdrop. Dois-je vous permettre de devenir vrai.


Oui; Vous devez définir allowdrop sur le conteneur. DodragDrop est une méthode que vous devez appeler sur MouseMove peu après MouseDown si la souris déplacée à l'extérieur Systeminformation.Dagsize .


Voir l'exemple ici: msdn.microsoft.com / FR-US / Bibliothèque / ...


Thx pour l'aide, je commencerai bientôt avec la publication de nombreuses questions sur la pile, je pense :)



25
votes

J'ai créé une forme simple qui démontrent comment déplacer le contrôle en faisant glisser le contrôle. L'exemple suppose qu'il y a une touche nommée Button1 sur le formulaire connecté au gestionnaire d'événements correspondant.

private Control activeControl;
private Point previousLocation;

private void button1_Click(object sender, EventArgs e)
{
    var textbox = new TextBox();
    textbox.Location = new Point(50, 50);
    textbox.MouseDown += new MouseEventHandler(textbox_MouseDown);
    textbox.MouseMove += new MouseEventHandler(textbox_MouseMove);
    textbox.MouseUp += new MouseEventHandler(textbox_MouseUp);

    this.Controls.Add(textbox);
}

void textbox_MouseDown(object sender, MouseEventArgs e)
{
    activeControl = sender as Control;
    previousLocation = e.Location;
    Cursor = Cursors.Hand;
}

void textbox_MouseMove(object sender, MouseEventArgs e)
{
    if (activeControl == null || activeControl != sender)
        return;

    var location = activeControl.Location;
    location.Offset(e.Location.X - previousLocation.X, e.Location.Y - previousLocation.Y);
    activeControl.Location = location;
}

void textbox_MouseUp(object sender, MouseEventArgs e)
{
    activeControl = null;
    Cursor = Cursors.Default;
}


3 commentaires

Voici la vidéo que j'ai créée après la mise en œuvre de ce YouTube.com/watch?v=itdfye7LA- Y


Pourquoi le bouton, j'ai ajouté ce code en fonction d'un panneau et il n'a pas fonctionné


Le bouton est juste là pour ajouter la zone de texte et la configuration de l'événement. Vous pouvez également le faire sur la charge de formulaire.



2
votes

C'est le moyen le plus simple: d'abord aller à votre nom de solution et clic droit. Sélectionnez "Gérer les packages Nuget". Après un moment, une fenêtre s'ouvre avec une barre de recherche sur le dessus. Choisissez l'option "Parcourir l'option" et recherchez le package Draggablecontrol. Le nom contrôle.Draggible doit être vu. Cliquez dessus puis sur Installer. Maintenant, vous pouvez utiliser ses commandes spéciales, par exemple.

  private void button1_Click(object sender, EventArgs e)
    {   Point p = new Point(20,70 * i);
        RichTextBox tb = new RichTextBox();
        tb.Location = p;
        tb.Height= 60;
        tb.Width = 100;
        tb.Font = Normal;
        ControlExtension.Draggable(tb,true);
        this.Controls.Add(tb);
        i++;


0 commentaires