设置:
我有一个带有AllowDrop =“True”和Drop =“MyDropEvent”的DataGrid。让我们忽略 drop 事件的处理,因为它归结为:
如果我在通过 VS 运行我的应用程序时或构建为 .exe 之后尝试将文件从 Windows 资源管理器拖/放到我的 DataGrid 上,它会起作用:在 DataGrid 上拖动时,光标会正确更新,并且在拖放时,MyDropEvent被称为。
但是,如果我使用 MSIX 打包相同的 WPF 应用程序,安装生成的 msixbundle 并运行已安装的应用程序,则将文件从资源管理器拖动到我的应用程序中只会给我标准的红色划掉的圆圈,并且不会出现 DragOver 或 Drop 事件打电话了。
虽然我一直使用 DataGrid 作为示例,但其他元素也是如此。看来从资源管理器中的拖放在某个地方完全被阻止了。
我怀疑这是某种权限/安全问题,尽管我不明白到底发生了什么或如何解决它。
我已经通过 Process Explorer 检查了我的应用程序和 explorer.exe 的完整性级别,两者都处于我期望的中等程度。
这就是我的 .appxmanifest 的样子:
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3"
IgnorableNamespaces="uap rescap uap3">
<Identity
...
<Properties>
...
</Properties>
<Dependencies>
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.0.0" MaxVersionTested="10.0.0.0" />
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14393.0" MaxVersionTested="10.0.14393.0" />
</Dependencies>
<Resources>
<Resource Language="x-generate"/>
</Resources>
<Applications>
<Application Id="App"
Executable="$targetnametoken$.exe"
EntryPoint="$targetentrypoint$">
<uap:VisualElements
DisplayName=...
Description=...
BackgroundColor="transparent"
Square150x150Logo="Images\Square150x150Logo.png"
Square44x44Logo="Images\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Images\Wide310x150Logo.png" Square71x71Logo="Images\SmallTile.png" Square310x310Logo="Images\LargeTile.png"/>
<uap:SplashScreen Image="Images\SplashScreen.png" />
</uap:VisualElements>
</Application>
</Applications>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="broadFileSystemAccess" />
<uap:Capability Name="removableStorage"/>
<uap:Capability Name="musicLibrary"/>
<uap3:Capability Name="backgroundMediaPlayback"/>
</Capabilities>
</Package>
broadFileSystemAccess 是我解决此问题的最新尝试,但没有成功。
我错过了什么?我很好奇到底是什么导致了这个问题,以及是否有一个修复方案,理想情况下不涉及完全重组我构建应用程序的方式。不幸的是,我确实需要 MSIX 包才能上传到 MS 商店。
干杯
编辑:
我还是没有运气。一旦安装了 msixbundle,它就拒绝处理任何和所有文件拖/放操作。
我尝试在 appxmanifest 编辑器中勾选每一个“功能”,尝试以管理员/非管理员身份运行,但没有成功。
我还尝试订阅主窗口的 Drop、DragOver、DragEnter、DragLeave、PReviewDragLeave、PreviewDragOver、PreviewDrop、PreviewDragEnter、QueryContinueDrag、PreviewQueryContinueDrag、GiveFeedback 和 PreviewGiveFeedback,但其中没有一个在已安装的应用程序中触发(工作正常)通过 VS 运行或构建 .exe 时运行)
有趣的是,gong-wpf-dragdrop在我的打包应用程序中也失败了。每当我尝试拖动它应该处理的任何东西时,它就会崩溃。我什至想不出一种方法来获取异常:在 DropHandler 内部尝试/捕获已经太晚了,异常避免了我所有未处理事件的处理程序,并且 VS 拒绝让我将调试器附加到应用程序已安装。
我访问系统上的任意文件绝对没有问题...文件资源管理器工作完美,我可以读取任意文件等。
好吧,我终于解决了:这似乎与我在 .csproj 中定义的 TargetFramework 有关:
此版本不允许在我的 MSIX 应用程序中进行拖放(我在全新的 WPF 项目中遇到同样的问题):
<TargetFramework>net6.0-windows10.0.22621.0</TargetFramework>
此版本运行没有问题:
<TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
前者是 Windows 11 .net,我想它出于某种原因不允许拖/放(至少对我来说)