Imports System.Windows
Interface IFileDragDropTarget
Sub OnFileDrop(ByVal filepaths As String())
End Interface
Public Class FileDragDropHelper
Public Shared Function GetIsFileDragDropEnabled(ByVal obj As DependencyObject) As Boolean
Return CBool(obj.GetValue(IsFileDragDropEnabledProperty))
End Function
Public Shared Sub SetIsFileDragDropEnabled(ByVal obj As DependencyObject, ByVal value As Boolean)
obj.SetValue(IsFileDragDropEnabledProperty, value)
End Sub
Public Shared Function GetFileDragDropTarget(ByVal obj As DependencyObject) As Boolean
Return CBool(obj.GetValue(FileDragDropTargetProperty))
End Function
Public Shared Sub SetFileDragDropTarget(ByVal obj As DependencyObject, ByVal value As Boolean)
obj.SetValue(FileDragDropTargetProperty, value)
End Sub
Public Shared ReadOnly IsFileDragDropEnabledProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsFileDragDropEnabled", GetType(Boolean), GetType(FileDragDropHelper), New PropertyMetadata(AddressOf OnFileDragDropEnabled))
Public Shared ReadOnly FileDragDropTargetProperty As DependencyProperty = DependencyProperty.RegisterAttached("FileDragDropTarget", GetType(Object), GetType(FileDragDropHelper), Nothing)
Shared WithEvents control As Windows.Controls.Control
Private Shared Sub OnFileDragDropEnabled(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
If e.NewValue = e.OldValue Then Return
control = TryCast(d, Windows.Controls.Control)
If control IsNot Nothing Then
AddHandler control.Drop, AddressOf OnDrop
End If
End Sub
Private Shared Sub OnDrop(ByVal _sender As Object, ByVal _dragEventArgs As DragEventArgs)
Dim d As DependencyObject = TryCast(_sender, DependencyObject)
If d Is Nothing Then Return
Dim target As Object = d.GetValue(FileDragDropTargetProperty)
Dim fileTarget As IFileDragDropTarget = TryCast(target, IFileDragDropTarget)
If fileTarget IsNot Nothing Then
If _dragEventArgs.Data.GetDataPresent(DataFormats.FileDrop) Then
fileTarget.OnFileDrop(CType(_dragEventArgs.Data.GetData(DataFormats.FileDrop), String()))
End If
Else
Throw New Exception("FileDragDropTarget object must be of type IFileDragDropTarget")
End If
End Sub
End Class
6条答案
按热度按时间qaxu7uf21#
在各种博客文章中有一些库,如gong和类似的片段。
但是,您不应该过于执着于绝对没有代码隐藏。例如,在我的书中,这仍然是MVVM:
命令绑定可能是一个更好的选择,但逻辑肯定是在视图模型中。使用像拖放这样的东西,你想在哪里画线就更容易了。你可以让代码隐藏解释拖动参数,并在适当的时候调用视图模型上的方法。
hvvq6cgz2#
下面是我写的一些代码,它允许你在不违反MVVM的情况下将文件拖放到控件上。它可以很容易地修改为传递实际的对象而不是文件。
用法:
确保DataContext从IFileDragDropTarget继承并实现OnFileDrop。
2exbekwf3#
这里有一个比Mustafa的解决方案更通用、更开箱即用、更简单的解决方案,它只有一个DependencyProperty
1.将此接口复制到项目中
1.使ViewModel实现接口
1.将此通用扩展复制到项目中
1.对所选的UI组件(此处为TextBox)启用“拖放文件”行为
快乐滴!
g6ll5ycj4#
对于VB开发人员来说,这只是将@Asheh的答案移植到VB .NET的一个附加答案。
u1ehiz5o5#
这可能对你有帮助。附加的命令行为库允许你将任何事件转换成一个更接近MVVM框架的命令。
http://marlongrech.wordpress.com/2008/12/13/attachedcommandbehavior-v2-aka-acb/
使用这个非常容易,而且救了我无数次的命
希望这能帮上忙
ujv3wf0j6#
基于@Kino101的回答,我创建了一个WinUI 3版本。它也可以作为gist提供。
第一个月
视图模型中的用法,例如
ViewModels/MainViewModel.cs
视图中的使用情况,例如
Views/MainPage.xaml