首先,MvvmCross很棒。和他们一起工作真的很愉快。
WP7中的辅助磁贴有一个小问题。我有一个经典的Master-Detail场景,我想为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);
});
}
}
这在viewmodel中是错误的,当然它不起作用...... 你能帮帮我吗?
答案 0 :(得分: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的WP7代码和tile的Xaml Uri - 以了解uri的生成方式,请参阅the librarian中GetXamlUriFor
周围的代码。
如果您想“按原样”使用此现有示例服务,则元数据中当前可用的字段为:
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的图像在不同平台上是否可以重复使用。
在实际水平上,当我开发需要大量定制实时图块的任何东西时 - 例如下载图像 - 然后我通常基于现有代码构建一个新的简单BookmarkLibrarian服务,这个自定义代码位于该项目的WP7 UI代码中(并且是注入ViewModel的接口)
我发现这种自定义方法使书签API更加简单,它允许我在WP7应用程序项目中编写WP7特定的逻辑(而不是在共享核心项目中)。
编写自定义书签服务的关键是了解如何在1中生成导航uri - 查看GetXamlUriFor
附近的代码 - 通过序列化MvxShowViewModelRequest
创建uri添加一个查询参数,指示此书签的唯一名称。
当您以这种方式添加书签时,您可以将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);
}
};
此代码允许直接打开书签。
如果您需要运行任何代码(例如代理商)来更新磁贴以使其“生效”,那么您必须自己做 - 我担心现在没有任何样品可用。 ..虽然我现在在Android和WP7中都在非UI项目中使用了Mvx - 所以我知道它可以完成!