8. Labor segédanyagok

Források

Snippet 01. RecipeDetailsPageViewModelDT

public class RecipeDetailsPageViewModelDT
{
    public RecipeHeader Header
    {
        get 
        { 
            return new RecipeHeader()
            {
                BackgroundImage = "http://lorempixel.com/1280/720/food/",
                Title = "Grilled Salmon with Chinese Barbeque Sauce",
            }; 
        }
    }

    public Recipe Details
    {
        get
        {
            return new Recipe()
            {
                BackgroundImage = "http://lorempixel.com/1280/720/food/",
                Title = "Lore impsum",
                Directions = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam eu varius tortor. Cras sapien tellus, pharetra id lorem eget, varius elementum enim. In eu velit erat. Vivamus ornare ligula et nulla mattis commodo. In molestie ornare velit, at varius leo semper ut. Mauris nec sapien vel lorem euismod varius. Sed pretium metus a sem faucibus interdum. Aliquam dolor felis, sodales eget malesuada a, sagittis sed sem. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec consectetur consequat ante a porttitor. Phasellus vehicula facilisis molestie. Nam nec scelerisque ante. Quisque sed neque tellus. Praesent iaculis feugiat urna, quis gravida urna convallis tincidunt.\nNulla ut iaculis orci. Cras maximus leo et volutpat bibendum. Morbi ornare sit amet elit vitae pellentesque. In orci dolor, interdum et purus non, commodo eleifend ligula. Mauris nec nisi elementum, mollis ante vel, finibus ex. Duis vulputate, purus eget volutpat fermentum, magna libero consequat metus, fermentum consequat sapien urna vitae ex. Quisque lobortis viverra hendrerit.",
                ExtraImages = new List<string>() { "http://lorempixel.com/720/540/food/" },
                Ingredients = new List<string>() { "Lorem impsum 1", "Lorem impsum 1", "Lorem impsum 1", "Lorem impsum 1" }
            };
        }
    }

    public bool IsDownloadInProgress { get { return false; } }
    public double DownloadProgress { get { return 0; } }
    public bool IsLoading { get { return false; } }
}

Snippet 02. StateSerializationHelper

public class StateSerializationHelper
{
    private static JsonSerializerSettings _jsonSettings = 
        new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects };

    public static string GetSerializedToString(object parameter)
    {
        return JsonConvert.SerializeObject(parameter, Formatting.Indented, _jsonSettings);
    }

    public static T GetDeserializedObject<T>(string parameter)
    {
        return JsonConvert.DeserializeObject<T>(parameter, _jsonSettings);
    }

    public static object GetDeserializedObject(string parameter)
    {
        return JsonConvert.DeserializeObject(parameter, _jsonSettings);
    }
}

Snippet 04. PageState

public class PageState
{
    public object Parameter { get; set; }
    public Dictionary<string, object> CustomState { get; set; }
    public DateTime CreatedDate { get; set; }
    public bool HasSavedState { get; set; }

    public TimeSpan Age
    {
        get { return DateTime.Now - CreatedDate; }
    }

    public static PageState CreateForSave(object parameter)
    {
        PageState pageState = new PageState
        {
            Parameter = parameter,
            CreatedDate = DateTime.Now,
            CustomState = new Dictionary<string, object>(),
            HasSavedState = true
        };

        return pageState;
    }
}

Snippet 04. PageBase - OnNavigatedTo/From

private String _pageKey;

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
    if (_pageKey != null) return;

    var frameState = SuspensionManager.SessionStateForFrame(Frame);
    _pageKey = "Page-" + Frame.BackStackDepth;

    object parameter = null;
    if (e.Parameter != null)
    {
        parameter = StateSerializationHelper.GetDeserializedObject((string)e.Parameter);
    }

    if (e.NavigationMode == NavigationMode.New)
    {
        // Clear existing state for forward navigation when adding a new page to the navigation stack
        var nextPageKey = _pageKey;
        int nextPageIndex = Frame.BackStackDepth;
        while (frameState.Remove(nextPageKey))
        {
            nextPageIndex++;
            nextPageKey = "Page-" + nextPageIndex;
        }

        if (ViewModel != null)
            await ViewModel.OnNavigatedTo(e, parameter, new PageState());
    }
    else
    {
        var pageState = (PageState)frameState[_pageKey];
        await LoadState(parameter, pageState);

        if (ViewModel != null)
            await ViewModel.OnNavigatedTo(e, parameter, pageState);
    }

    PartialOnNavigatedTo(e);
}

protected async override void OnNavigatedFrom(NavigationEventArgs e)
{
    var frameState = SuspensionManager.SessionStateForFrame(Frame);
    var pageState = PageState.CreateForSave(e.Parameter);
    await SaveState(pageState);

    if (ViewModel != null)
        await ViewModel.OnNavigatedFrom(e, pageState);

    frameState[_pageKey] = pageState;

    PartialOnNavigatedFrom(e);
}