2

首先,MvvmCross 很棒。和他们一起工作真的很愉快。

我对 WP7 中的辅助图块有一个小问题。我有一个经典的主细节场景,我想为细节(视图/视图模型)做辅助图块。那么如何从 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);

                    });
            }
        }

这在视图模型中是错误的,当然它不起作用......你能帮帮我吗?

4

1 回答 1

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 是如何生成的,请参阅librarianGetXamlUriFor中的代码。


如果您想“按原样”使用这个现有的示例服务,那么元数据中当前可用的字段是:

        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 的逻辑。


编写自定义书签服务的关键是了解导航 uri 是如何生成的1 - 参见附近的代码GetXamlUriFor- 通过序列化 anMvxShowViewModelRequest并添加一个指示此书签唯一名称的查询参数来创建 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 - 所以我知道它可以做到!

于 2012-07-19T18:21:49.263 回答