문제

내 앱에서 화면 간을 탐색하는 방법을 찾고 있습니다.기본적으로 지금까지 본 내용은 쿼리 문자열 매개변수가 포함된 문자열 URI를 NavigationService에 전달하는 것으로 구성됩니다.

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

궁극적으로는 마법의 끈이 필요하고 나중에 문제가 발생할 수 있기 때문에 나는 이것에 별로 관심이 없습니다.

이상적으로는 탐색하려는 클래스의 인스턴스를 생성하고 매개변수를 생성자에 인수로 전달하는 것입니다.이것이 가능한가?그렇다면 어떻게?

도움이 되었습니까?

해결책

실제 탐색은 문자열을 결국 사용해야합니다. 안전한 래퍼를 만들거나 사용할 수 있습니다.

"noreferrrer"> Caliburn Micro 유형에만 사용되는 경우에만 사용하더라도 Caliburn Micro 다음은 스 니펫 WP8에서 사용하는 튜토리얼에서 :

툴킷과 함께 제공되는 NavigationService는 모델 먼저 접근법을 지원합니다. 사용자 URL (표준 접근 방식)을 선언하는 대신, 우리는 우리가 디스플레이하고자하는 ViewModel인지를 선언하십시오. 이 서비스는 올바른 URL을 만들고보기 모델 과 관련된보기를 표시합니다.

"NoreferRer"> Windows Phone MVC 도 일부 유형 안전 탐색을 볼 수 있습니다. MS-PL .

다른 팁

기본적으로는 내장되어 있지 않습니다.불행하게도 IRepository 인스턴스와 같은 복잡한 매개 변수는 Silverlight의 탐색 기능 범위를 벗어납니다.나는 보통 이를 처리하기 위해 어떤 형태의 IoC 컨테이너를 사용합니다.더 간단한 POCO 매개변수는 문자열로 쉽게 직렬화되지만 여전히 매직 문자열과 수동 쿼리 문자열 구문 분석이 필요합니다.

그러나 유형이 안전한 것을 직접 쉽게 만들 수 있습니다.예를 들어, 내 접근 방식은 다음과 같습니다.

매개변수 데이터의 경우 'Extras'라는 클래스가 있습니다. Dictionary<string, object> 같은 방법으로 GetBool(string), GetInt32(string), 등이며 정적 팩토리 메서드가 있습니다. CreateFromUri(Uri);이것은 내 목적에 충분합니다.

나는 이것을 유형 안전 탐색과 함께 사용합니다.저는 MVVM 패턴을 정말 좋아하며 각 페이지에는 거의 모든 논리를 캡슐화하는 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);

이는 최종적으로 강력한 형식의 탐색과 유사한 모습을 제공합니다.이는 기본적인 접근 방식입니다.내 머리 꼭대기에서 탐색 속성에 필수 매개변수를 추가하고 탐색 시 유효성을 검사하면 이 문제가 개선될 수 있습니다.또한 nav 인수의 값에 따라 최종 목적지가 결정되는 더 복잡한 유형의 탐색도 지원하지 않습니다.그럼에도 불구하고 이것은 나의 90% 사용 사례에 적합합니다. 아마도 귀하에게도 효과가 있을 것입니다.

인스턴스를 정확히 얻는 방법과 같이 여기서는 확실히 일부 세부 사항이 생략되었습니다. NavigationService - 오늘 밤에 좀 더 완전한 샘플을 만들 수 있지만 시작하기에는 이것으로 충분합니다.

PhoneApplicationService.State

를 사용할 수 있습니다.

Dictionary<String,Object>

입니다.

PhoneApplicationService.State는 일반적으로 삭제 표시에서 현재 상태를 저장하는 데 사용됩니다. 그러나 페이지간에 데이터를 편리하게 전달하는 데 사용할 수 있습니다.

MSDN 문서

Windows Phone 응용 프로그램은 사용자가 탐색 할 때 비활성화됩니다. 다른 응용 프로그램. 사용자가 응용 프로그램으로 돌아갈 때 뒤로 버튼을 사용하거나 실행기 또는 선택기 작업을 완료하여 응용 프로그램이 다시 활성화됩니다. 응용 프로그램은 일시적으로 저장할 수 있습니다 핸들러의 상태 사전의 응용 프로그램 상태 비활성화 된 이벤트. 활성화 된 이벤트 핸들러에서는 응용 프로그램을 사용할 수 있습니다 상태 사전에 저장된 값을 일시적인 응용 프로그램에 사용하십시오. 주.

기본적으로 당신이하는 일은

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;
.

이 기능을 사용하는 방법은 더 많은 indepth

WPF는 이미 생성된 객체로의 탐색을 지원하지만 WP8에는 이것이 부족합니다. Navigate 초과 적재.

XAML 페이지 URI를 하드 코딩하지 않으려면 다음(약간 더러운) 도우미 함수를 사용하여 일부 클래스의 .xaml 리소스 URI를 가져올 수 있습니다.

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

그런 다음 해당 URL을 수정하고 해당 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. 페이지 URI에서 쿼리 문자열 을 사용하지 마십시오. 이는 뷰가 재료를 표시 해야하는 것만 큼 완전히 다시되어 있지만 항목을로드하고 선택하는 실제 로직은 ViewModel에 있습니다.

2. 클래스를 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