質問

アプリの画面間を移動する方法を探しています。基本的に、私がこれまで見てきたことは、クエリ文字列パラメータを備えた文字列 URI を NavigationService に渡すことで構成されています。

NavigationService.Navigate(new Uri("/MainPage.xaml?selectedItem=" +bookName.Id, UriKind.Relative));

ただし、最終的には魔法の文字列が必要であり、将来的に問題が発生する可能性があるため、私はこれにはあまり乗り気ではありません。

理想的には、移動先のクラスのインスタンスを作成し、パラメーターを引数としてコンストラクターに渡すだけです。これは可能でしょうか?もしそうなら、どのようにして?

役に立ちましたか?

解決

実際のナビゲーションは弦を最終的に使わなければならないが、あなたは安全なタイプのラッパーを作成または使用することができます。

Caliburn Micro を見ることをお勧めします。これはスニペット Windows Phone MVC を見ることができます。 MS-PL <では、自分で使用するようにナビゲーションコードを引き出すこともできます。 / a>。

他のヒント

基本的には必要ありません、そうじゃないのですのでお問い合わせ下さい。複雑なパラメータのようにIRepositoryインスタンスは、残念ながらの能力の設備をSilverlight;私は、通常、何らかの形でのIoCコンテナ扱います。簡単なPOCOパラメータは簡単に直列化された文字列がることが必要であるが魔法の文字列とマニュアルのクエリ文字列の構文解析.

できるかを容易に構築いtypesafeます。例えば、こちらの私。

パラメータのデータ、クラスIの"エキストラ、ラップ、 Dictionary<string, object> 方法など GetBool(string), GetInt32(string), 等 やはstaticファクトリメソッド CreateFromUri(Uri);これは良いです。

その結果が、先ほど任天堂さんとtype-安全なナビゲーションうョンパターンは、ひとりひとりのページはViewModel包ほぼすべての論理です。の一対一の関係のページをViewModel、後者の理想的なナビます。ること、属性および反射し、このグループに参加"ボタン:

public class NavigationTargetAttribute : Attribute
{
    private readonly Type target;

    public ViewModelBase Target
    {
        get { return target; }
    }

    public NavigationTargetAttribute(Type target)
    {
        this.target = target;
    }
}

ひとつあれば、これらがそれぞれのページを正しViewModelタイプです。

[NavigationTarget(typeof(LoginViewModel))]
public class LoginPage : PhoneApplicationPage
{ ... }

そして、シングルトンNavigationManager的クラスは、ことができるの?

GetType().Assembly
    .GetTypes()
    .Select(t => new { Type = t, Attr = t.GetCustomAttributes(false).FirstOrDefault(attr => attr is NavigationTargetAttribute) })
    .Where(t => t.Attr != null);

とはまさにそのような、収集の航行可能種類のアプリです。からない作品たちに見てもらうとともに、辞書です。を利用する場合には、条約がおページ、(例えば)との間で変換型のUriに、非常に簡単に...例えば、 new Uri("/Pages/" + myPageType.Name + ".xaml", UriKind.Relative).などの追加支援のためのクエリパラメータ。最後に、まと方法はこのように:

public void Navigate(Type target, Extras extras)
{
    Type pageType;
    if (navigationTargets.TryGetValue(target, out pageType))
    {
        var uri = CreateUri(pageType, extras);
        navigationService.NavigateTo(uri);
    }

    // error handling here
}

これに関しては、ページの OnNavigatedTo メソッドは、このように:

var extras = Extras.CreateFromUri(e.Uri);
((ViewModelBase) DataContext).OnNavigatedTo(extras);

この最後には、semblanceの強入力します。これは植物庭園、ボージョワーアプローチトップを切っき加に必要なパラメータを属性と妥当性を検証してのナビゲーション。でも対応しておりませんより複雑な種類のナビゲーション、場の価値が容易になり、業務効率の引数を決定する究極の先になります。しかし、このスーツ私の90%使用の場合れないかもしれます。

あり詳細は省略このような方法と同一のインスタンスを取得します NavigationService -かすこともできます完全なサンプル後、今夜は、これで十分取得します。

使用できます PhoneApplicationService.State

それは Dictionary<String,Object>

PhoneApplicationService.State は、アプリケーションの現在の状態を保存するためにトゥームストン処理で一般的に使用されます。ただし、ページ間でデータを簡単に受け渡すために使用できます。

MSDN ドキュメント

Windows Phoneアプリケーションは、ユーザーが別のアプリケーションに移動すると非アクティブ化されます。ユーザーがバックボタンを使用して、またはランチャーまたはChooserタスクを完了することにより、アプリケーションに戻ると、アプリケーションが再アクティブ化されます。アプリケーションは、非アクティブ化されたイベントのために、ハンドラーのステートディクショナリに一時的なアプリケーション状態を保存できます。アクティブ化されたイベントハンドラーでは、アプリケーションは状態辞書に保存されている値を一時的なアプリケーション状態に使用できます。

基本的にあなたがやることは

PhoneApplicationService.State.add(selectedName,yourobjectInstance);
NavigationService.Navigate((new Uri("/MainPage.xaml?selectedItem="+selectedName,UriKind.Relative));

次に、ナビゲートされたメソッドでそれを取得できます

YourObject yourObjectInstance;
var yourObj = PhoneApplicationService.State["yourObjectName"];
yourObjectInstance = yourObj is YourObject ? (yourObj as YourObject) : null;

この機能の使用方法について詳しく説明します。

WPFは、既に作成されたオブジェクトへのナビゲートをサポートしていますが、WP8はNavigateオーバーロードを欠いています。

xamlページのURIをハードコードしたくない場合は、次の(ビットダーティ)ヘルパー関数を使用して、いくつかのクラスの.xamlリソースURIを取得できます。

static Uri GetComponentUri<T>() where T : DependencyObject, new() {
    return BaseUriHelper.GetBaseUri(new T());
}
.

そのURLを変更してナビゲートすることができます。

var baseUri = GetComponentUri<SomePage>(); //Uri="pack://application:,,,/MyProject;component/MainWindow.xaml"
var pageUri = new UriBuilder(baseUri) { Query = "selectedItem=" + bookName.Id };
NavigationService.Navigate(pageUri);
.

私たちの解決策はちょうどいい罰金:
1. QUERY STRINGS を使用しないでください.URIのを使用すると、これは完全に再びMVVMだけですが、ビューを表示するだけではありませんが、アイテムをロードして選択するための実際のロジックはViewModelです。
2. class> constページ名を使用してクラスを作成し、ナビゲートしたいときはいつでも、これを使用します。

public static class P
{
    public const string ArticlePage = "/Pages/ArticlePage.xaml";
    public const string OnlineSectionPage = "/Pages/OnlineSectionPage.xaml";
    public const string GalleryPage = "/Pages/GalleryPage.xaml";
    ...
}

// in our viewModel
NavigationService.Navigate(P.ArticlePage);

// In navigation service
public void Navigate(string pagePath)
{
    if (EnsureMainFrame())
    {
        mainFrame.Navigate(new Uri(pagePath, UriKind.RelativeOrAbsolute));
    }
}
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top