1

我正在尝试使用 VS2013 RC 在 Caliburn.Micro WinRT 8.1 应用程序中打开设置视图,但在打开它时我不断收到未处理的异常,并显示以下消息:

值不能为空。参数名称:无法解析应用清单中的 VisualElements。

我可以通过以下步骤重现问题:

  1. 使用空白应用模板从 VS2013 RC 创建一个新的 Windows 应用商店应用。
  2. 通过 NuGet 添加 Caliburn.Micro。
  3. 在 App.xaml 中,将基类更改为 caliburn:CaliburnApplication(命名空间声明为 xmlns:caliburn="using:Caliburn.Micro")。
  4. 在 App.xaml.cs 中,像这样更改类(对于基于 CM 的设置,我遵循http://compiledexperience.com/blog/posts/settings-caliburn

下面的代码:

public sealed partial class App 
{
  private WinRTContainer _container;    

  public App()
  {
      InitializeComponent();
  }

  protected override void Configure()
  {
      _container = new WinRTContainer();
      _container.RegisterWinRTServices();

      _container.PerRequest<MainViewModel>();
      _container.PerRequest<SettingsViewModel>();

      ISettingsService settings = _container.RegisterSettingsService();
      settings.RegisterCommand<SettingsViewModel>("Test settings");
  }

  protected override object GetInstance(Type service, string key)
  {
      var instance = _container.GetInstance(service, key);
      if (instance != null) return instance;
      throw new Exception("Could not locate any instances.");
  }

  protected override IEnumerable<object> GetAllInstances(Type service)
  {
      return _container.GetAllInstances(service);
  }

  protected override void BuildUp(object instance)
  {
      _container.BuildUp(instance);
  }

  protected override void PrepareViewFirst(Frame rootFrame)
  {
    _container.RegisterNavigationService(rootFrame);
  }

  protected override void OnLaunched(LaunchActivatedEventArgs args)
  {
    DisplayRootView<MainView>();
  }
}
  1. 最后,在解决方案中为 Views 和 ViewModels 创建文件夹,向其中添加所需的项目:MainViewModel、SettingsViewModel、MainView、SettingsView。这些视图只包含一个带有一些文本的 TextBlock。MainViewModel 派生自 Screen,而 SettingsViewModel 派生自 PropertyChangedBase。其中任何一个都没有相关代码。

启动应用程序时,我可以看到主视图;然后我打开超级按钮栏并点击设置,我找到了指向我的应用设置的标签;当我单击它时,我得到上面引用的异常。有什么提示吗?

您可以在此处找到完整的复制解决方案:http: //sdrv.ms/18GIMvB

4

2 回答 2

0

如果您还没有准备好迁移到 CM 的 alpha 版本,您可以通过 NuGet 将 Callisto 更新到 1.4.0。这为我解决了错误。

于 2014-02-28T15:24:26.393 回答
0

似乎新的 CM 版本(alpha 2)解决了这个问题,所以我在这里添加更多信息来帮助像我这样的其他新手。这是我现在正在做的事情:

在应用程序中,Configure我有一些引导代码,例如:

...
ResourceLoader loader = ResourceLoader.GetForViewIndependentUse("Resources");
ISettingsService settings = _container.RegisterSettingsService();
settings.RegisterFlyoutCommand<ContentSettingsViewModel>(loader.GetString("SettingsContent"));

ContentSettingsViewModel是用于过滤某些内容的视图模型。从资源中获取的字符串是将出现在设置弹出窗口中的标签(确保此字符串有一个条目,因为传递空或空字符串会触发异常)。这个虚拟机是从 CM 派生的,Screen因为我正在覆盖OnActivateOnDeactivate在用户打开或关闭设置页面时加载和保存设置。

于 2014-03-02T13:33:09.970 回答