Статьи

Реальный мир Windows Phone Dev Часть 3: Caliburn.Micro и прикладная инфраструктура

В этой серии статей будет рассказано о создании отлаженного, работающего приложения для Windows Phone от начала до конца. Приложение называется Realworld Stocks, и полный исходный код будет доступен на CodePlex по мере развития серии. Я буду использовать Mercurial, чтобы поощрять разветвление и, возможно, даже получать запросы от разработчиков, которые хотят внести свои собственные реальные решения.

Убедитесь, что вы загружаете Windows Phone 7.5 SDK


Посмотреть серию Введение и план

Caliburn.Micro

Многие приложения для Windows Phone используют легковесную инфраструктуру MVVM для базовых сервисов инфраструктуры. Realworld Stocks собирается использовать Caliburn.Micro. Я имел большой успех с Caliburn.Micro в моих предыдущих приложениях для Windows Phone и Silverlight. CM был создан Робом Айзенбергом и находится в процессе активной разработки, имеет большое сообщество и последователей.

В этой статье будет подробно рассказано о настройке Caliburn.Micro, но полную документацию смотрите в официальной документации проекта .

Установка Caliburn.Micro от NuGet

Если вы следили за этим, то у вас уже установлен NuGet. Если нет, см. Часть 2: Файл -> Новый проект .

Caliburn.Micro необходимо установить как в проекты RealWorldStocks.Client.Core, так и в RealWorldStocks.Client.UI .

Из консоли диспетчера пакетов

Чтобы получить Caliburn.Micro, вы можете открыть консоль диспетчера пакетов и ввести следующую команду, но убедитесь, что вы выбрали правильный проект по умолчанию. Вы должны установить CM в проекты .Core и .UI!

образ

Из интерфейса управления пакетами NuGet

В качестве альтернативы вы можете щелкнуть правой кнопкой мыши оба проекта в обозревателе решений и выбрать «Управление пакетами NuGet…», затем щелкнуть панель «Онлайн» и выполнить поиск Caliburn.Micro. Вы должны установить CM в проекты .Core и .UI!

image_thumb [19]

 

Завершение настройки Caliburn

После завершения установки Caliburn.Micro откроется веб-страница с инструкциями для завершения настройки.

  1. Следуйте инструкциям, которые открылись в Visual Studio
  2. Убедитесь, что ваши App.xaml и App.xaml.cs удалены из приведенных выше инструкций!
  3. Удалить MainPage.xaml
  4. В RealworldStocks.Client.UI создайте новую папку с именем Framework
  5. Удалить AppBootstrapper.cs
  6. Создайте новый файл AppBootstrapper.cs в папке Framework
  7. Вставьте следующий код в AppBoostrapper.cs

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using Caliburn.Micro;
using Microsoft.Phone.Controls;
using RealWorldStocks.Client.UI.ViewModels.Home;
 
namespace RealWorldStocks.Client.UI.Framework
{
   public class AppBootstrapper : PhoneBootstrapper
   {
        PhoneContainer _container;
 
        protected override void Configure()
        {
            _container = new PhoneContainer(RootFrame);
 
            _container.RegisterPhoneServices();
            _container.Singleton<HomeViewModel>();
        }
 
        protected override void OnUnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
        {
            if (Debugger.IsAttached)
            {
                Debugger.Break();
                e.Handled = true;
            }
            else
            {
                MessageBox.Show("An unexpected error occured, sorry about the troubles.", "Oops...", MessageBoxButton.OK);
                e.Handled = true;
            }
 
            base.OnUnhandledException(sender, e);
        }
 
        protected override object GetInstance(Type service, string key)
        {
            return _container.GetInstance(service, key);
        }
 
        protected override IEnumerable<object> GetAllInstances(Type service)
        {
            return _container.GetAllInstances(service);
        }
 
        protected override void BuildUp(object instance)
        {
            _container.BuildUp(instance);
        } 
   }
}

8. Поскольку мы переместили AppBoostrapper в пространство имен RealWorldStocks.Client.UI.Framework, нам нужно обновить наш App.xaml . Вставьте следующее в ваш App.xaml

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:Framework="clr-namespace:RealWorldStocks.Client.UI.Framework"
             x:Class="RealWorldStocks.Client.UI.App">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Assets/Constants.xaml"/>
                <ResourceDictionary Source="Assets/Styles.xaml"/>
                <ResourceDictionary Source="Assets/Converters.xaml"/>
            </ResourceDictionary.MergedDictionaries>
             
            <Framework:AppBootstrapper x:Key="bootstrapper" />
        </ResourceDictionary>
    </Application.Resources>
</Application>

Работа вокруг небольшой ошибки NuGet

На момент написания этой статьи в пакете NuGet, по-видимому, была ошибка, из-за которой мой проект является проектом Silverlight (вместо Windows Phone).

Если пакет NuGet создал ShellViewModel.cs в вашем проекте, то вам нужно будет предпринять следующие шаги:

  1. Удалить ShellViewModel.cs
  2. Удалить IShell.cs
  3. Удалить ShellView.xaml

Инфраструктура приложений

образЗаключительные части нашей инфраструктуры включают следующее:

Конвертеры значений

У меня есть набор IValueConverters, который я использовал во всех своих проектах Windows Phone. Их можно посмотреть из исходного кода CodePlex .

активы

Ресурсы — это набор ResourceDictionaries, которые содержат ресурсы, используемые в приложении. Их можно посмотреть из исходного кода CodePlex .

Constants.xaml

Определяет переменные, такие как «AppName», чтобы их можно было использовать на страницах

<TextBlock Text = »{StaticResource AppName}» />

Converters.xaml

Определяет набор преобразователей, используемых в нашем проекте

Styles.xaml

Определяет набор повторно используемых стилей

 

ViewModels

ViewModels определяют логику для всех наших представлений. Они используют преимущества великолепных механизмов связывания XAML и ActionMessages Caliburn, чтобы контролировать поведение наших представлений. Позже в этой серии мы углубимся в Views и ViewModels.

Для начала убедитесь, что у вас есть папка ViewModels , затем щелкните правой кнопкой мыши и выберите New Item… , добавьте файл класса с именем HomeViewModel.cs.

public class HomeViewModel : Screen
{
    public HomeViewModel()
    {
        DisplayName = "Home";
    }   
}

Просмотры

Представления — это ваши страницы .xaml и пользовательские элементы управления. Позже в этой серии мы углубимся в Views и ViewModels.

Для начала убедитесь, что у вас есть папка Views , затем щелкните правой кнопкой мыши и выберите New Item… , добавьте портретную страницу Windows Phone под названием HomeView.xaml

WMAppManifest.xml

Наконец, вам нужно обновить WMAppManifest, чтобы сообщить ему, какую страницу следует загружать при запуске приложения.

Откройте WMAppManifest.xml и установите NavigationPage на свою основную страницу

<DefaultTask Name="_default" NavigationPage="Views/HomeView.xaml" />

Запустить его!

Теперь мы куда-то добираемся. У нас есть большая часть нашей инфраструктуры приложений, и у нас есть первые View и ViewModel. Если вы нажмете F5 сейчас, он должен запуститься прямо в HomeView!

Проблемы?

Если приложение закрывается сразу после запуска, проверьте следующее:

  1. WPAppManifest NavigationPage указывает на реально существующий файл .xaml
  2. Убедитесь, что в вашем App.xaml.cs нет ничего, кроме InitializeComponent (), а в App.xaml есть только Bootstrapper. См. Документацию Caliburn.Micro для получения дополнительной информации.
  3. Проверьте пространства имен в ваших ViewModels и Views и убедитесь, что пространства имен ViewModels и Views совпадают
  4. Для дальнейшего поиска неисправностей Caliburn проверьте документацию Caliburn.Micro

Источник:  http://www.matthidinger.com/archive/2011/10/16/RealWorldWPDev-Part-3-Caliburn-Micro-and-Application-Infrastructure.aspx