问题标签 [prism-6]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1334 浏览

c# - Xamarin Forms DependencyService with Prism with Autofac 崩溃 - 未处理的异常

因此,为了继续我对 Xamarin 的首次尝试,我正在尝试开发一个可以拍摄照片的内容页面,然后将照片保存在设备库中以供查看。我正在将 Prism 与 A​​utofac 一起使用,并且我正在关注DependencyService 上的 wiki 文档以及GitHub 上提供的示例,但程序在没有解释原因的情况下崩溃了。

我讨厌那个!

所以,这是我的界面:

视图模型:

和安卓代码:

请注意,确实具有 DependencyService 的程序集属性。我还想指出,我没有使用模拟器来测试它。相反,我正在使用我的 Galaxy Note 4,因为我正在尝试测试相机。对于这部分,我使用的是 James Montemagno 的 Xamarin.Plugins,效果很好。我只是无法保存它,或者如果它确实保存到设备中,请查看图片。

那么我哪里错了?

更新:其他人问我要在我的 Android 应用程序中添加什么权限,所以在 AndroidManifest.xml 中:

并在 file_paths.xml 中(在 Resources\xml 目录中)

0 投票
1 回答
1063 浏览

android - PRISM Xamarin.Forms INavigationService 理解

我很难理解 PRISM 如何INavigationService映射到Navigation.PushAsyncXamarin Forms 提供的标准。

我有一个开始使用 XF 的应用程序。它由一个MasterDetailPage主页组成,“详细信息”ContentPage包含许多按钮,这些按钮用于导航到其他功能。在 App.xaml.cs 中,我将 Application.MainPage 设置为包含在 NavigationPage“”中的主页实例MainPage = new NavigationPage(new HomePage())。然后,当我想显示功能页面时,我调用“ Navigation.PushAsync(new NewPage())”,这将显示新页面以及包含后退按钮的工具栏;然后,我可以使用设备上的后退按钮或工具栏中的后退按钮导航回我的主页。请注意,该应用程序在 Android 上运行。

然后我研究了集成 PRISM.Forms;我想使用它,因为我多年来一直将 PRISM 用于 WPF,并且认为它应该证明是有益的。我正在使用最新版本(6.3)。

我基于“PRISM 模板”创建了一个新应用程序,然后将差异复制到我现有的项目中......

  • “App”类现在基于“PrismApplication”而不是“PrismApplication.RegisterTypes”中的“Application”
  • 我为我希望能够导航到的所有表单调用“Container.RegisterForNavigation” 在“PrismApplication.OnInitialized”的末尾
  • 我打电话给“INavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(HomeMasterDetailPage)}");”
  • 在我之前调用“Navigation.PushAsync”的地方,我调用“INavigationService.NavigateAsync(nameof(NewPage))”在“MainActivity”中,我使用“IPlatformInitializer”调用“App”构造函数

到目前为止,一切都很好。我按预期看到了我的主页。但是,当我导航到“NewPage”时,工具栏中没有后退按钮(尽管我仍然有来自 的“汉堡包”菜单MasterDetailPage),如果我使用设备上的后退按钮,它会将我返回到操作系统。该页面似乎已作为 MasterDetailPage 的“内容”部分插入,而不是作为新的子页面导航到它。

我确信这不是设计使然,因此我误解了一些东西,但有人可以指出我正确的方向,否则我觉得我将不得不放弃 PRISM 并寻找替代方案。

在尝试将登录屏幕引入组合时,我也遇到了问题。我首先调用“ INavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(LoginPage)}");”,然后如果登录成功,我调用“ INavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(HomeMasterDetailPage)}");”进入主页;这里的问题是,在显示主页 (a MasterDetailPage) 时,我不再看到“汉堡包”按钮来打开页面的“主”部分。我怀疑这可能也与我使用INavigationService不正确有关,但如果不是,我可以将其作为一个单独的问题提出。

0 投票
0 回答
99 浏览

c# - 如何在 ViewModelBase 中使用 DelegateCommand?

我有一个如下所示的 ViewModelBase:

在我的类中,我像这样从 ViewModelBase 继承:

当我按下保存按钮(位于不同组中的功能区中)时,命令执行但代码不会运行 FooViewVM,而是在 ViewModelBase 中的虚拟空白处停止。我有点困惑,因为我认为 VM 中的方法会被执行(因为它覆盖了基础中的虚拟方法)。我在基类中定义了太多接口吗?我应该将 DelegateCommand(s) 移动到每个 VM 中而不是继承吗?最后,我想更好地理解为什么这不像我预期的那样工作。

0 投票
1 回答
439 浏览

c# - PropertyChanged 事件中的 NullReferenceException (Prism 6.3)

我正在使用 Prism 6.3 用 seafile 构建一个简单的云客户端。
用户登录后,我导航到侧边区域 (SidebarRegion) 中的侧边栏。OnNavigatedTo是加载到集合中并显示的库。

当所选库更改时,我导航到一个新的 ItemsView 实例 (ContentRegion) 并加载项目(从库中),以便它们也可以显示。

如果现在单击一个项目,我会导航到另一个侧面区域以显示有关该项目的详细信息。

还有一个删除按钮,它与删除项目的命令挂钩

现在,从服务器中删除项目/文件后,我PubSubEvent使用该方法连接了从库中重新加载项目RefreshItemsAsync()。项目集合被覆盖后,PropertyChanged事件会抛出NullReferenceException,即使我尝试这样做:

我还尝试从集合中删除该项目,并将该项目作为 的有效负载PubSubEvent,但它也会抛出一个NullReferenceExceptionat _items.Remove(itemFromPayload)
即使我通过按钮手动刷新集合,结果也是一样的。
每个ItemsViewModel库只创建一次,即使在它们之间切换后也会抵抗,所以引用应该存在。

我在这里错过了什么?

0 投票
1 回答
15198 浏览

xamarin.forms - 哪个 IoC 容器更适合 Prism.Forms

我正在开始一个新Prism.Forms项目,我想知道各种IoC 容器Autofac、或)Dryloc中的哪一个最适合继续进行。NinjectUnity

我不知道这是否属实,但我在某处读到 Unity 不再处于积极开发中,因为这MEF是唯一的IoC 容器,我不确定这是否是要走的路。

Autofac同时,我对, Drylocor知之甚少或一无所知Ninject

请在任何建议中保持客观,提供您认为其中一个比其他更好的理由,而不是简单地“我使用xxx ”;我想做出明智的决定。

0 投票
0 回答
225 浏览

prism - dotmemory 快照崩溃应用程序

Resharper Ultimate:2016.3.2 DotMemory:2016.3.2 Visual Studio 2017 Windows 7 Prism 6.3.0 Ninject

这有点奇怪,所以我不确定如何描述它,但我会试一试。

最初,我设置了向其区域注册的页面,因此我的所有页面都声明如下

然后将它们绑定到该区域。

在更新内容时,我决定不再麻烦绑定页面并将它们注册到区域,而是切换到使用 RequestNavigate,因此我删除了向区域注册视图,并将绑定更改为

在调试模式下,这一切都很好。然而,这就是事情变得奇怪的地方。我运行 dotmemory 进行了一些泄漏测试,发现如果我在进入某些页面之前拍摄快照,软件就会崩溃。如果我没有拍摄快照,或者我在进入页面后拍摄了快照,则没有任何崩溃。

另外,如果我添加

绑定页面后,我也没有问题。(所以现在这是我可怕的临时修复)

我只是想知道是否有人知道为什么会发生这种情况。我得出的唯一两个结论是

a) RequestNavigate 没有通过 ninject 正确解析。b) 不知何故,从 dotmemory 获取快照正在清除内核中尚未解决的任何内容。

我的期望并不高,但如果有人有任何想法可能导致这种情况,它会有所帮助。

0 投票
1 回答
523 浏览

xamarin.forms - Xamarin.Forms,使用 Prism.Forms NavigationService

我正在尝试使用 Xamarin Forms 和 Prism 实现登录场景。

我的应用程序根页面是 MasterDetail 页面 ( HomeMasterDetailPage);这用于提供侧面菜单。

我想要做的是将显示的HomeMasterDetailPage页面内容设置为LoginPage. 当用户登录时,内容应更改为HomeDetailContentPage. LoginPage使用后退按钮应该无法返回。

我正在使用 Prism Forms 的 NavigationService。

我的开机是这样的...

如果用户尚未登录,这将正确显示其中的LoginPage内容,HomeMasterDetailPage如果用户已登录,则HomeDetailContentPage显示相同HomeMasterDetailPage的内容。

实际登录时出现问题;以下是视图模型中的代码LoginPage...

我的理解是,通过使用绝对 Uri,这应该重置导航,以便新的页面排列 (/NavigationPage/HomeMasterDetailPage/HomeDetailContentPage) 位于堆栈的顶部和底部,然后允许我从那里继续前进。相反,我得到了一个未处理的异常(在 Android 7.0 上)。

我究竟做错了什么?

注意:我看到的所有示例MasterDetailPage的根目录都设置为NavigationPage/ContentPage; 当我尝试这个时,我没有遇到异常,但是侧边菜单在其中的操作有所不同MasterDetailPage- 当您点击“汉堡包”时,侧边菜单会滑入所有内容(包括操作/标题栏),并且清除它的唯一方法是点击滑入的侧面菜单外部,而当我在操作/标题栏下方显示MasterDetailPage侧面NavigationPage菜单时,汉堡会变为一个箭头,您可以单击该箭头再次隐藏侧面菜单。

0 投票
1 回答
62 浏览

module - 应该有棱镜。卸载模块?(Xamarin 形式)

我对按需加载许多动态程序集感兴趣。

由于所有这些模块都可能产生太大的内存压力,因此我想在操作系统指示或检测到缺乏活动时卸载它们。

如何卸载以前加载的模块?退出应用程序是唯一的方法吗?

0 投票
2 回答
59 浏览

c# - 在 Xamarin 上使用 Prism 时,如果 View 和 ViewModel 上的名称不匹配,我如何发出警告?

Prism 使用 MVVM 样式约定命名将 View 绑定到 Xamarin 应用程序上的 ViewModel。

我最近更改了一些演示代码,并在花了太多时间调试之后意识到页面名称与视图不匹配。

如何启用日志记录或预编译器警告存在这种差异?

0 投票
1 回答
288 浏览

wpf - 如何将 Shell 中的按钮绑定到已加载模块的视图模型中定义的命令?

场景是这样的:

我有一个在 WPF、MVVM、Prism 6.3.0 中开发的应用程序。这个应用程序认为

  • Shell.xaml(外壳)
  • UserControl1.xaml(在模块内,独立类库)

当我单击 Shell 中定义的 Button 时,我希望正在执行的命令和 CanExecute 中定义的条件得到验证。但是,这个命令被定义到作为模块视图模型的 ViewModel 类中(在这个应用程序中将有多个模块,加载为 Prism 传统上实现这一点)。

为了被调用,我尝试在Shell的资源集合中定义一个localviewmodel。这会触发命令,但不会触发条件 CanExecute。

如果我将用户控件中定义的 XAML 代码放在模块内(换句话说,如果我编写一个不使用内容区域管理器的简单应用程序)一个单页 XAML 应用程序,则该命令将毫无问题地验证 CanExecute。我最好的猜测是将模块视图模型中定义的命令绑定到 Shell 中的按钮的问题。在阅读了很多关于它的内容后,我只是没有得到声明绑定的正确方法。

这是一个例子:

其中 MyRecords 是保存数据的 GridView 的名称,LocalViewModel 是加载的模块中定义的 ViewModel 实例的键。因此,在 LocalViewModel 的某个时间点有两个实例,一个定义为 Shell.xaml 中的资源,另一个定义到包含“MyRecords”GridView 的已加载模块中。

当然,使用一页示例,这完美无缺。而且因为我需要编写几个模块,每个模块都定义了自己的 ViewModel,或者不止一个。所以,那是因为我需要使用从 Shell定义到不同模块的视图模型中的命令。如果我在 shell 中声明每个 ViewModel(大量数据进入)可能会是一个性能问题。

那么,如何将 ViewModel 中定义的命令(来自 shell)调用为“按需”加载的模块中的资源?

感谢大家。