首先,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中只是错误的,当然它是行不通的...
你能帮我吗?
最佳答案
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 }
});
这将调用WP7代码,该代码会生成TileData和一个用于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的图像能否在不同平台上重复使用。
在实践上,当我开发任何需要大量定制 Activity 图块的内容时,例如下载的图片-然后我通常根据现有代码构建一个新的简单BookmarkLibrarian服务,此自定义代码位于该项目的WP7 UI代码中(并且将接口(interface)注入(inject)到ViewModel中)
我发现这种自定义方法使书签API更加简单,它使我可以在WP7应用程序项目中(而不是在共享核心项目中)编写WP7特定的逻辑。
编写自定义书签服务的关键是要了解如何在1中生成导航uri-请参阅
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);
}
};
此代码允许直接打开书签。
如果您需要运行任何代码(例如,代理)以更新磁贴以使其“实时”运行,则您必须自己执行此操作-恐怕目前没有任何可用的示例...尽管我现在已经在Android和WP7的非UI项目中使用了Mvx-我知道可以做到!
关于windows-phone-7 - MvvmCross和WP7辅助磁贴,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11566460/