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 には、いくつかの単純なライブ タイル/ブックマークを追加できる 1 つのサンプル サービスが含まれています - 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 がどのように生成されるかを理解するには、 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 固有のロジックを記述できるようになります。


カスタム ブックマーク サービスを作成するための鍵は、ナビゲーション URI が1でどのように生成されるかを理解することです -近くのコードを参照してください- URI は、このブックマークの一意の名前を示すクエリ パラメータをGetXamlUriForシリアル化し、追加することによって作成されます。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 を使用しました。

于 2012-07-19T18:21:49.263 に答える