Статьи

Достижения Visual Studio для Windows Phone — Заключительные замечания перед бета-версией

Я наконец получил Visual Studio Achievements для Windows Phone на стадии бета-тестирования. Я еще много делаю, и вы можете увидеть запланированную дорожную карту здесь ; однако я решил выпустить бета-версию, чтобы найти существующие проблемы, пока работаю над остальными дополнительными функциями приложения.

Перед выпуском я добавил некоторые модификации в базу кода, чтобы приложение не зависало и я мог связываться с данными гораздо более эффективным способом.

Одной из основных проблем, с которыми я столкнулся во время первоначального тестирования, была возможность связывать записи данных, когда они загружаются динамически (например, из живых плиток). Поскольку исходная версия класса BindingPoint была реализована как обычный класс со статическими свойствами, я не смог напрямую реализовать INotifyPropertyChanged, чтобы уведомить представление об измененных значениях. Чтобы решить эту проблему, я реализовал этот класс в виде поточно-ориентированного синглтона . Посмотрите на модифицированный класс BindingPoint :

using System.Collections.ObjectModel;
using System.ComponentModel;
using System;

namespace VisualStudioAchievements
{
    public class BindingPoint : INotifyPropertyChanged
    {
        static BindingPoint instance = null;
        static readonly object padlock = new object();

        public BindingPoint()
        {
        }

        public static BindingPoint Instance
        {
            get
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new BindingPoint();
                    }
                    return instance;
                }
            }
        }
        //Used for the PerformanceProgressBar element that is bound to it, to represent
        //whether the NinerReader request failed or not.
        private bool _hidePerfBar;
        public bool HidePerfBar
        {
            get
            {
                return _hidePerfBar;
            }
            set
            {
                if (_hidePerfBar != value)
                {
                    _hidePerfBar = value;
                    NotifyPropertyChanged("HidePerfBar");
                }
            }
        }

        public ObservableCollection<Niner> Niners { get; set; }

        private Niner _currentNiner;
        public Niner CurrentNiner
        {
            get
            {
                return _currentNiner;
            }
            set
            {
                if (_currentNiner != value)
                {
                    _currentNiner = value;
                    NotifyPropertyChanged("CurrentNiner");
                }
            }
        }

        private CompareNinerPair _comparedNiners;
        public CompareNinerPair ComparedNiners { 
            get
            {
                return _comparedNiners;
            }
            set
            {
                if (_comparedNiners != value)
                {
                    _comparedNiners = value;
                    NotifyPropertyChanged("ComparedNiners");
                }
            }
        }

        public ObservableCollection<CompareAchievementPair> ComparedAchievements { get; set; }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                App.MainPageDispatcher.BeginInvoke(() => { PropertyChanged(this, new PropertyChangedEventArgs(info));});
            }
        }
    }
}

Еще одна модификация, которую я реализовал, поддерживала светлую тему. Мэтт «Roguecode» отправил отчет, в котором говорилось, что кнопки и поля на критически важных страницах не были видны при выборе светлой темы. Это была критическая проблема, которая вынудила меня повторно отправить первоначальную бета-версию, поскольку существует большая группа пользователей, которые имеют легкую тему и не смогут использовать приложение. Исправить было легко — измените части XAML, используя первый совет здесь . Вместо использования жестко заданных значений цвета, я заменил некоторые из них предварительно определенными зависящими от темы ресурсами.

Класс NinerReader теперь использует безопасный для вызова параметр Action <T> вместо пользовательского делегата:

public void GetNiner(string name, bool isInit, Action<Niner> action = null)

При наличии делегата у меня часто возникали проблемы, когда возвращенный Niner не был правильно передан в используемый экземпляр. Таким образом, я получал дубликаты записей пользователя, когда ни одна из них не была нужна. Относительно небольшое исправление, которое имеет большое значение:

reader.GetNiner(niner.Alias, true, extractedNiner =>
{
    BindingPoint.Instance.Niners.Add(extractedNiner);
});

Незначительные изменения включают настройку пользовательского интерфейса, поэтому теперь она более организована:

При этом, бета-версия теперь доступна . Поскольку я работаю над вопросами, которые представлены, а также над дополнительными функциями, вы можете скачать последнюю версию исходного кода здесь .