【发布时间】:2021-01-14 00:06:27
【问题描述】:
我最近开始了一个小项目,以更新我获得的少量 wpf 知识并尝试新的东西。我对 MvvmCross 很感兴趣,但我想暂时保持它的小。我的目标是一个简单的图像操作器;图像到 ascii,重新着色等等......
我的设置: Mvx Core Library (.NET Standard 2.0)
- MainViewModel - 有方法 OpenFileDialog_Clicked 被输入到 openFileDialogCommand
Wpf 应用程序 (.NET Core 3.1)
- MainView - 有一个带有按钮的菜单,该按钮绑定到 MainViewModel 上的 openFileDialogCommand
我撞到的墙: 尝试获取 OpenFileDialog(命名空间:Microsoft.Win32)来执行此操作:
public void OpenFile_Clicked()
{
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
Nullable<bool> result = dlg.ShowDialog();
if(result) {
// big cash prize
}
}
我指定了命名空间,因为我发现了几篇关于 OpenFileDialog 缺少引用的文章。就我而言,遮阳篷是.NET Standard。 OpenFileDialog 根本不存在,这正是我的问题。当核心库必须是 .NET Standard 类型时,我应该如何在 ViewModel 中调用 OpenFileDialog?对 wpf 项目的依赖不会破坏整个 mvvm 模式吗?! 老实说:我已经阅读了整个 mvx 文档并找到了一些线索,但我对 wpf/mvvm/xaml 的理解可能扩展到其中的三分之一。 MvvmCross Inversion of Control 文档对我来说看起来很有用,但我仍然不明白这在我的情况下是如何工作的。给定的示例https://www.mvvmcross.com/documentation/fundamentals/inversion-of-control-ioc?scroll=43 没有显示这些接口的位置,对我来说,这一切都分解为我需要以某种方式将 OpenFileDialog 从 wpf 项目中获取到核心项目中。
【问题讨论】:
-
您应该使用库 Windows.Form。所有的Dialogs都是一个window dll comdlg32.dll (Common Dialog)。网络库(和 Excel VBA 等其他应用程序)创建包装器并使用不同的参数调用 dll(参见:pinvoke.net/default.aspx/comdlg32.GetOpenFileName)。
-
@jdweng 如果我理解正确,添加: [DllImport("Comdlg32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool GetOpenFileName(ref OpenFileName ofn);到我的 MainViewModel 应该完成工作吗?伟大的!我会在工作完成后回复最后一次。
-
您不需要使用 DllImport。不知道为什么它丢失了。但是 Comdlg 会起作用。
-
"MainViewModel - 有方法 OpenFileDialog_Clicked" 为什么?这不是 MVVM。点击处理程序应该在视图的代码隐藏中。用户输入通常不应由视图模型处理。用户输入是视图组件 (UI) 的职责。
-
删除此依赖项允许您将库限制为 .NET Standard 兼容性。否则,您将强制它与 .NET Framework 或 .NET Core 兼容,以便使用
System.Windows.Forms.dll程序集。
标签: c# wpf .net-core mvvmcross openfiledialog