添加 Window 句柄到子域中的 FileSavePicker Sub 运行
Add Window Handle to FileSavePicker Sub Running in Sub-Domain
我正在尝试将 Windows.Graphics.Printing3D
API 的功能集成到 WiseJ VB.Net 应用程序中以创建 .3mf 文件。
Printing3D 方法依赖于 UWP,因此我创建了一个允许这些方法运行的子域。一切都很好,直到它遇到我的 SaveTo3mf()
方法,该方法利用 FileSavePicker
。此时我得到一个 InvalidWindowHandle
异常并且该方法在此行失败:
Dim storageFile = Await savePicker.PickSaveFileAsync()
我研究了这个问题,我明白或认为我明白问题是子域在主域之外运行,所以它无法检索 window 句柄。我尝试通过使用 IInitializeWithWindow
来解决这个问题如下所示。我使用 Invoke()
相信它会 return 有问题的方法到主域,但错误仍然存在。
我将代码拼凑在一起,不能声称在处理域或线程方面有任何专业知识。是替代方法,还是我的实现有误?代码可以通过所需的引用正常编译。
<ComImport>
<Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Interface IInitializeWithWindow
Sub Initialize(ByVal hwnd As IntPtr)
End Interface
Delegate Sub Invoker(localPackage As Printing3D3MFPackage)
Public Async Sub Build3MF()
Dim packages = Await CreatePackageAsync()'method not shown, it seems to work properly once I added the sub-domain
Dim c1 As New FilePicker
Dim msd As Invoker = AddressOf c1.SaveTo3mf
msd.Invoke(packages)
End Sub
Private Class FilePicker
Inherits Page
Public Async Sub SaveTo3mf(localPackage As Printing3D3MFPackage)
Dim savePicker As FileSavePicker = New FileSavePicker()
savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary
savePicker.DefaultFileExtension = ".3mf"
savePicker.FileTypeChoices.Add("3MF File", {".3mf"})
Dim hWnd = Me.Handle'I added this to see if it produced a result; it does
Dim initWindow As IInitializeWithWindow = CType(CObj(savePicker), IInitializeWithWindow)
initWindow.Initialize(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle)
Dim storageFile = Await savePicker.PickSaveFileAsync()'Fail point
If storageFile Is Nothing Then
Else
Using stream = Await localPackage.SaveAsync()
stream.Seek(0)
Using dataReader = New DataReader(stream)
Await dataReader.LoadAsync(CUInt(stream.Size))
Dim buffer = dataReader.ReadBuffer(CUInt(stream.Size))
Await FileIO.WriteBufferAsync(storageFile, buffer)
End Using
End Using
End If
End Sub
End Class
碰巧对我来说,编程是艰苦学习的另一种说法。通过学习 WiseJ,我的 vb.net 理解得到了增强。它们有一个简单的函数 Application.Download(File,"FileName")。这使我可以直接获取流并在此过程中应用文件名下载它。它没有允许用户 select 一个位置的优雅,但文件被下载到“下载”文件夹供用户访问。
我正在尝试将 Windows.Graphics.Printing3D
API 的功能集成到 WiseJ VB.Net 应用程序中以创建 .3mf 文件。
Printing3D 方法依赖于 UWP,因此我创建了一个允许这些方法运行的子域。一切都很好,直到它遇到我的 SaveTo3mf()
方法,该方法利用 FileSavePicker
。此时我得到一个 InvalidWindowHandle
异常并且该方法在此行失败:
Dim storageFile = Await savePicker.PickSaveFileAsync()
我研究了这个问题,我明白或认为我明白问题是子域在主域之外运行,所以它无法检索 window 句柄。我尝试通过使用 IInitializeWithWindow
来解决这个问题如下所示。我使用 Invoke()
相信它会 return 有问题的方法到主域,但错误仍然存在。
我将代码拼凑在一起,不能声称在处理域或线程方面有任何专业知识。是替代方法,还是我的实现有误?代码可以通过所需的引用正常编译。
<ComImport>
<Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1")>
<InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
Interface IInitializeWithWindow
Sub Initialize(ByVal hwnd As IntPtr)
End Interface
Delegate Sub Invoker(localPackage As Printing3D3MFPackage)
Public Async Sub Build3MF()
Dim packages = Await CreatePackageAsync()'method not shown, it seems to work properly once I added the sub-domain
Dim c1 As New FilePicker
Dim msd As Invoker = AddressOf c1.SaveTo3mf
msd.Invoke(packages)
End Sub
Private Class FilePicker
Inherits Page
Public Async Sub SaveTo3mf(localPackage As Printing3D3MFPackage)
Dim savePicker As FileSavePicker = New FileSavePicker()
savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary
savePicker.DefaultFileExtension = ".3mf"
savePicker.FileTypeChoices.Add("3MF File", {".3mf"})
Dim hWnd = Me.Handle'I added this to see if it produced a result; it does
Dim initWindow As IInitializeWithWindow = CType(CObj(savePicker), IInitializeWithWindow)
initWindow.Initialize(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle)
Dim storageFile = Await savePicker.PickSaveFileAsync()'Fail point
If storageFile Is Nothing Then
Else
Using stream = Await localPackage.SaveAsync()
stream.Seek(0)
Using dataReader = New DataReader(stream)
Await dataReader.LoadAsync(CUInt(stream.Size))
Dim buffer = dataReader.ReadBuffer(CUInt(stream.Size))
Await FileIO.WriteBufferAsync(storageFile, buffer)
End Using
End Using
End If
End Sub
End Class
碰巧对我来说,编程是艰苦学习的另一种说法。通过学习 WiseJ,我的 vb.net 理解得到了增强。它们有一个简单的函数 Application.Download(File,"FileName")。这使我可以直接获取流并在此过程中应用文件名下载它。它没有允许用户 select 一个位置的优雅,但文件被下载到“下载”文件夹供用户访问。