2012-07-19 79 views
2

首先,MvvmCross太棒了。与他们合作非常愉快。MvvmCross和WP7次要瓷砖

我在WP7中的辅助拼贴有一个小问题。我有一个经典的主 - 细节场景,我想为Detail(View/ViewModel)执行辅助拼贴。 那么如何从ViewMode创建辅助拼贴?

public IMvxCommand DetailPinCommand 
     { 
      get 
      { 
       return new MvxRelayCommand<Detail>((d) => 
        { 
         StandardTileData NewTileData = new StandardTileData 
         { 
          Title = d.Name 
          ... 
          ... 
         }; 

         ShellTile.Create(new Uri("/Views/DetailView.xaml?DetailId=" + d.ID, UriKind.Relative), NewTileData); 

        }); 
      } 
     } 

这是错误的视图模型,当然这是行不通的...... 你能帮助我吗?

回答

1

MVX包括一个例子服务,允许添加一些简单的活瓷砖/书签 - MvxWindowsPhoneLiveTileBookmarkLibrarian.cs

这是目前仅实施了WP7 - 但Android和WinRT的书签也可以使用相同的模板,未来有可能。

如果你想使用图书馆服务,你可以尝试这样的:

IMvxBookmarkLibrarian librarian; 
if (!this.TryGetService<IMvxBookmarkLibrarian>(out librarian)) 
{ 
    // not much can be done... 
    return; 
} 

var metadata = new BookmarkMetadata() 
{ 
    Title = detail.Name, 
}; 

var uniqueName = "DetailBookmark" + detail.UniqueId; 

librarian.AddBookmark(
      typeof(DetailViewViewModel), 
      uniqueName, 
      metadata, 
      new Dictionary<string, string>() 
        { 
         { "detailId", detail.UniqueId } 
        }); 

这将通过调用生成的TileData和XAML中的URI瓦WP7码 - 了解如何在URI生成,请参阅中的代码the librarian


如果你想使用这个现有的样本服务“是”,那么目前在元数据中可用的字段有:

 public Uri BackgroundImageUri { get; set; } 
     public string Title { get; set; } 

     public Uri BackBackgroundImageUri { get; set; } 
     public string BackTitle { get; set; } 
     public string BackContent { get; set; } 

     public int Count { get; set; } 

,但这些领域诚然目前非常WP7具体的 - 例如,我怀疑Uri在不同的平台上可以重复使用的形象。


在实践层面上,当我开发任何需要大量定制活动拼贴的内容时 - 例如,下载的图像 - 然后我通常基于现有的代码建立一个新的简单书签服务器服务,并且这个自定义的代码位于该项目的WP7 UI代码中(并且被注入到ViewModel中的接口)

我发现这种定制方法书签API更加简单,它允许我在WP7应用程序项目(而不是共享核心项目)内编写WP7特定的逻辑。


编写自定义书签服务的关键是明白的导航URI是如何在1产生的 - 看近GetXamlUriFor编码 - URI是通过序列化MvxShowViewModelRequest并添加指示唯一的查询参数创建此书签的名称。


当你以这种方式添加书签,那么你可以调整你的“正常”开始在WP7 App.xaml.cs导航代码是这样的:

 RootFrame.Navigating += (innerSender, args) => 
      { 
       if (!_firstNavigation) 
        return; 
       _firstNavigation = false; 

       var applicationStart = this.GetService<IMvxStartNavigation>(); 
       if (args.Uri.ToString().Contains("MainPage.xaml") 
        || !applicationStart.ApplicationCanOpenBookmarks) 
       { 
        args.Cancel = true; 
        RootFrame.Dispatcher.BeginInvoke(applicationStart.Start); 
       } 
      }; 

此代码允许书签直接打开。


如果您需要运行任何代码(例如,一个代理)更新瓦片使其“生活”,那么你将不得不自己做这件事 - 恐怕目前没有任何样品可用......尽管我现在在非UI项目中使用了Mvx在Android和WP7中 - 所以我知道它可以做到!

+0

感谢您的回答,但接下来会发生什么? 辅助瓷砖仍然在MasterView上导航,DetailViewModel在构造函数中有detailId参数... – manro 2012-07-19 19:43:44

+0

Ahhh - 对不起 - 忘记了详细信息...将更新答案... – Stuart 2012-07-19 20:07:31

+0

更新 - 对不起了(这不是我为几个月!) – Stuart 2012-07-19 20:09:27