Ich habe eine kleine WPF-Anwendung, die ein Fenster mit einem Bildsteuerelement hat. Die Bildsteuerung zeigt ein Bild aus dem Dateisystem. Ich möchte, dass der Benutzer das Bild ziehen und auf den Desktop oder irgendwo hin ablegen kann, um es zu speichern. Es funktioniert gut.
Aber ich möchte ein kleines Bild-Miniaturbild zusammen mit dem Mauszeiger anzeigen, wenn der Benutzer es zieht. Genau wie wir ein Bild aus dem Windows-Datei-Explorer an eine andere Stelle ziehen. Wie erreicht man das?
Aktuelles Verhalten von Drag / Drop
Gewünschtes Verhalten
Hier ist mein XAML-Code
<Grid>
<Image x:Name="img" Height="100" Width="100" Margin="100,30,0,0"/>
</Grid>
Hier ist C # Code
public partial class MainWindow : Window
{
string imgPath;
Point start;
bool dragStart = false;
public MainWindow()
{
InitializeComponent();
imgPath = "C:\\Pictures\\flower.jpg";
ImageSource imageSource = new BitmapImage(new Uri(imgPath));
img.Source = imageSource;
window.PreviewMouseMove += Window_PreviewMouseMove;
window.PreviewMouseUp += Window_PreviewMouseUp;
window.Closing += Window_Closing;
img.PreviewMouseLeftButtonDown += Img_PreviewMouseLeftButtonDown;
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
window.PreviewMouseMove -= Window_PreviewMouseMove;
window.PreviewMouseUp -= Window_PreviewMouseUp;
window.Closing -= Window_Closing;
img.PreviewMouseLeftButtonDown -= Img_PreviewMouseLeftButtonDown;
}
private void Window_PreviewMouseMove(object sender, MouseEventArgs e)
{
if (!dragStart) return;
if (e.LeftButton != MouseButtonState.Pressed)
{
dragStart = false; return;
}
Point mpos = e.GetPosition(null);
Vector diff = this.start - mpos;
if (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
string[] file = { imgPath };
DataObject d = new DataObject();
d.SetData(DataFormats.Text, file[0]);
d.SetData(DataFormats.FileDrop, file);
DragDrop.DoDragDrop(this, d, DragDropEffects.Copy);
}
}
private void Img_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
this.start = e.GetPosition(null);
dragStart = true;
}
private void Window_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
dragStart = false;
}
}
c#
wpf
drag-and-drop
Riz
quelle
quelle
DragDrop.GiveFeedback
. Überprüfen Sie diese stackoverflow.com/questions/4878004/…Antworten:
Offiziell sollten Sie die IDragSourceHelper- Oberfläche verwenden, um einer Drag & Drop-Operation eine Vorschau-Bitmap hinzuzufügen.
Leider verwendet diese Schnittstelle die IDataObject :: SetData-Methode, die von der .NET DataObject-Klasse nicht auf COM-Ebene implementiert wird, sondern nur auf .NET-Ebene.
Die Lösung besteht darin, ein von der Shell bereitgestelltes IDataObject für jedes Shell-Element (hier eine Datei) mithilfe der Funktion SHCreateItemFromParsingName und der Methode IShellItem :: BindToHandler wiederzuverwenden .
Beachten Sie, dass diese Funktionen automatisch Zwischenablageformate wie FileDrop hinzufügen. Wir müssen jedoch weiterhin IDragSourceHelper verwenden, um das Vorschaubild hinzuzufügen.
So können Sie es verwenden:
Und hier ist der Code:
quelle
Hier, versuchen Sie dies. Es "nimmt" ein rotes transparentes Quadrat um die Mausposition auf und "lässt" es fallen, wenn Sie erneut klicken.
In Wirklichkeit möchten Sie den Thread erstellen, der das Interop beim Klicken ausführt, und ihn stoppen (nicht abbrechen), wenn Sie ihn löschen.
Und Code dahinter:
quelle