2 Stimmen

.NET: gibt es ein "Desktop-ähnliches" Steuerelement zum Klicken und Ziehen?

OK, zunächst ein Blick auf den Windows-Desktop: Sie können Elemente (Ordner, Dateien) auf dem Desktop an verschiedene Orte ziehen und sie bleiben dort, wohin Sie sie gezogen haben. Dies scheint eine ziemlich nützliche Funktion zu sein, um den Benutzern die Möglichkeit zu geben, ihre eigenen "Gruppierungen" von Objekten zu erstellen.

Meine Frage lautet wie folgt: Gibt es ein Steuerelement in .NET, das dieses Verhalten mit einer Sammlung von Elementen annähert?

Ich denke an so etwas wie eine Listenansicht im "LargeIcon"-Modus, aber es erlaubt Ihnen, die Symbole an verschiedene Stellen innerhalb des Steuerelements zu ziehen.

6voto

Hans Passant Punkte 894572

Sie können dies mit einem Standard-ListView-Steuerelement tun, indem Sie Drag-and-Drop implementieren. Hier ist ein Beispiel für ein solches Steuerelement:

using System;
using System.Drawing;
using System.Windows.Forms;

public class MyListView : ListView {
  private Point mItemStartPos;
  private Point mMouseStartPos;

  public MyListView() {
    this.AllowDrop = true;
    this.View = View.LargeIcon;
    this.AutoArrange = false;
    this.DoubleBuffered = true;
  }

  protected override void OnDragEnter(DragEventArgs e) {
    if (e.Data.GetData(typeof(ListViewItem)) != null) e.Effect = DragDropEffects.Move;
  }
  protected override void OnItemDrag(ItemDragEventArgs e) {
    // Start dragging
    ListViewItem item = e.Item as ListViewItem;
    mItemStartPos = item.Position;
    mMouseStartPos = Control.MousePosition;
    this.DoDragDrop(item, DragDropEffects.Move);
  }
  protected override void OnDragOver(DragEventArgs e) {
    // Move icon
    ListViewItem item = e.Data.GetData(typeof(ListViewItem)) as ListViewItem;
    if (item != null) {
      Point mousePos = Control.MousePosition;
      item.Position = new Point(mItemStartPos.X + mousePos.X - mMouseStartPos.X,
          mItemStartPos.Y + mousePos.Y - mMouseStartPos.Y);
    }
  }
}

1 Stimmen

Beachten Sie, dass dies nur mit .NET 2.0 funktioniert. Außerdem benötigen Sie nicht die InteropServices. Streichen Sie OnHandleCreated() und CreateParams() und fügen Sie dem Konstruktor this.AutoArrange = false; und this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); hinzu.

1voto

Joel Coehoorn Punkte 377088

Ich denke, am ehesten käme das ListView-Steuerelement in Frage, aber auch das ist eher ein Explorer-Fenster. Sie könnten in der Lage sein, Ihre eigene Ansicht zu erstellen, die tut, was Sie wollen, aber Sie müssten manuell Symbol Standorte irgendwo persistieren.

0 Stimmen

Danke; ich wollte Liste schreiben siehe nicht auflisten Box ... aber ich glaube nicht, dass ein ListView können Sie die Elemente innerhalb von ihm ziehen, nicht wahr?

0 Stimmen

Die Windows-Desktop-Symbolschnittstelle ist in Wirklichkeit ein Windows-ListView-Steuerelement, das in nicht verwaltetem Code (C oder C++) geschrieben wurde.

1voto

Totty Punkte 926

Wenn Sie nicht gegen die Verwendung von WPF sind, hat Josh Smith eine ziemlich ordentliche Leinwand erstellt, die ich derzeit für ein Projekt verwende. Damit können Sie Steuerelemente hinzufügen und sie auf der Leinwand verschieben. Man müsste zwar regeln, was auf die Leinwand geladen wird und wo beim nächsten Laden des Programms, aber das ist ziemlich einfach. http://www.codeproject.com/KB/WPF/DraggingElementsInCanvas.aspx

1voto

Haydar Punkte 1272

Dies hängt davon ab, ob es sich um eine Windows-Anwendung oder eine Webbrowser-basierte Anwendung handelt. In beiden Fällen benötigen Sie eine Art von Container, um die Positionen der Steuerelemente zu verwalten. Sie können die Position der Steuerelemente innerhalb eines Containers mit ihren X- und Y-Koordinaten verwalten.

Die eigentliche Bewegung wird mit Hilfe der Drag-Ereignisse durchgeführt. Sie haben also den Start des Ziehens, während des Ziehens (Sie könnten eine Platzhaltergrafik anzeigen oder den Cursor ändern) und schließlich das Ende des Ziehens (x und y des Steuerelements auf die neue Position setzen). Natürlich sind dies nicht die tatsächlichen Ereignisnamen, aber eine Suche nach "how to handle drag events" sollte Ihnen den Einstieg erleichtern.

In einer Web-Umgebung, ich weiß, Jquery hat Dragging-Fähigkeit in gebaut. So können Sie möchten, dass zu sehen. Die eine große Sache, die Sie müssen vorsichtig sein, ist die Aufrechterhaltung der Positionen Ihrer Kontrollen zwischen Postbacks. Ich bin nicht sicher, was in diesem Fall passieren würde.

0voto

Ledom Punkte 1

Windows verwendet ListView32 ein internes Steuerelement mit Drag-n'-Drop-Funktionen für Platzhalter, benutzerdefinierte Rahmen...

Die Position des Symbols kann in einer XML-Datei oder in den Anwendungseinstellungen gespeichert werden (indem die XML-Datei als String gespeichert und bei Bedarf in eine Datei konvertiert wird).

Das können Sie zum Beispiel tun:

<icons>
    <icon1>
        <name>Icon1</name>
        <text>My PC</text>
        <imageIndex>16</imageIndex>
    </icon1>
    <icon2>
        .....
    </icon2>            
    .....
</icons>

Lorenzo

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X