MvvmCross和WP7辅助磁贴

时间:2012-07-19 17:46:08

标签: windows-phone-7 mvvm mvvmcross

首先,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中是错误的,当然它不起作用...... 你能帮帮我吗?

1 个答案:

答案 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 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特定的逻辑(而不是在共享核心项目中)。


编写自定义书签服务的关键是了解如何在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 - 所以我知道它可以完成!