Windows phone 7 MvvmCross和WP7辅助磁贴

Windows phone 7 MvvmCross和WP7辅助磁贴,windows-phone-7,mvvm,mvvmcross,Windows Phone 7,Mvvm,Mvvmcross,首先,MvvmCross非常棒。和他们一起工作真的很愉快 我对WP7中的二次瓷砖有一个小问题。我有一个典型的主细节场景,我想对细节(视图/视图模型)进行二次平铺。 那么,如何从ViewMode创建辅助平铺呢 public IMvxCommand DetailPinCommand { get { return new MvxRelayCommand<Detail>((d) =>

首先,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);

                    });
            }
        }
public IMvxCommand DetailPinCommand
{
得到
{
返回新的MvxRelayCommand((d)=>
{
StandardTileData NewTileData=新的StandardTileData
{
Title=d.名称
...
...
};
Create(新Uri(“/Views/DetailView.xaml?DetailId=“+d.ID,UriKind.Relative”),NewTileData);
});
}
}
这在viewmodel中是错误的,当然它不起作用。。。
您能帮助我吗?

Mvx包括一个示例服务,允许添加一些简单的实时互动程序/书签-

这目前只在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 }
                   });
        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);
                }
            };
但这些字段目前确实非常特定于WP7,例如,我怀疑图像Uri在不同平台上是否可以很好地重用


在实践层面上,当我开发任何需要对实时互动程序进行大量定制的东西时(例如下载的图像),我通常会基于现有代码构建一个新的简单书签库服务,并且该定制代码位于该项目的WP7 UI代码中(并且是注入到ViewModel中的接口)

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


编写自定义书签服务的关键是了解导航uri是如何在中生成的-请参阅
GetXamlUriFor
附近的代码-通过序列化
MvxShowViewModelRequest
并添加指示此书签唯一名称的查询参数来创建uri


以这种方式添加书签后,可以将WP7 App.xaml.cs中的“正常”启动导航代码调整为类似以下内容:

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 }
                   });
        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);
                }
            };
RootFrame.Navigating+=(innerSender,args)=>
{
如果(!\u firstNavigation)
返回;
_firstNavigation=false;
var applicationStart=this.GetService();
if(args.Uri.ToString()包含(“MainPage.xaml”)
||!applicationStart.ApplicationCanOpenBookmarks)
{
args.Cancel=true;
RootFrame.Dispatcher.BeginInvoke(applicationStart.Start);
}
};
此代码允许直接打开书签



如果您需要运行任何代码(例如代理)来更新互动程序以使其“生效”,那么您必须自己执行此操作-恐怕现在没有任何可用的示例。。。虽然我现在已经在Android和WP7的非UI项目中使用了Mvx,所以我知道这是可以做到的

谢谢你的回答,但下一步呢?二级互动程序仍在MasterView上导航,DetailViewModel在构造函数中有detailId参数…已更新-再次抱歉(这不是我已经做了几个月的事情!)