Инициализаторы объектов (Object Initializers) – это полезная возможность языка C#, которая позволяет инициализировать необходимые свойства объекта прямо во время его создания. Поскольку синтаксически эта «фича» очень близка к инициализации объекта с передачей параметров через конструктор, многие разработчики начинают забивать на принципы ООП (в частности на понятие инварианта) и использовать ее, где только можно.
Но даже если не переходить к холиварам и малопонятным терминам, давайте рассмотрим небольшой пример, и подумаем над тем, может ли он привести к проблемам или нет:
// position передается извне или настраиватся каким-то образом
long position = -1;
using (var file = newFileStream("d:\\1.txt", FileMode.Append)
BusyIndicator’ы используют все, поэтому PleaseWaitService может пригодится многим. Демонстрация работы:
Вам больше не нужно ставить прогресс бары на каждую страницу и использовать свойства IsBusy в своей ViewModel. Для некоторых случаев такой подход вполне уместен.
Как использовать PleaseWaitService:
var service = newPleaseWaitService();
//operation started
service.Push();
//operation ended
service.Pop();
Очень удобно, когда вам нужно запустить несколько асинхронных операций.
Этот сервис, а также MVVM фреймворк Catel доступны здесь: http://catel.codeplex.com/
Под комбинацией клавиш понимается любое количество одновременно нажатых клавиш, нажатых в любом порядке, которое может позволить ваша клавиатура. Для конечного пользователя, однако, не стоит превышать количество более пяти в одной комбинации, т.к. игровые клавиатуры есть не у всех.
Другой вариант добавления, где в качестве комбинации берутся текущие нажатые клавиши, удобно в случае когда пользователь назначает комбинацию сам. В демке есть пример подобной записи комбинаций.
Конверторы являются одной из важнейшей особенностью механизма привязки в WPF. Они позволяют управлять тем, как источник привязки будет представлен в UI. В данной статье я покажу, как немного упростить использование конвертеров в XAML коде. Рассмотрим простейший пример:
internalclass DateTimeToString : IValueConverter
{ publicoverrideobjectConvert(objectvalue, Type targetType, object parameter, CultureInfo culture)
{ DateTime date = (DateTime)value; return date.ToShortDateString();
}
Большинство источников по использованию атрибутов [1, 2] рассказывают, что они есть, «обеспечивают эффективный способ связывания метаданных или декларативной информации с кодом», могут быть получены при помощи отражений [3].
В рамках данной статьи, я попробую показать прикладной пример применения атрибутов: проверка заполненности обязательных полей на форме добавления/редактирования нового бизнес-объекта.
Итак начнем. Как я уже привел чуть выше: «Атрибуты обеспечивают эффективный способ связывания метаданных или декларативной информации с кодом». Что же такое эти самые метаданные? В большинстве случаев, это просто дополнительная информация о классе, свойстве или методе, которая на работу класса, свойства или метода не влияет. Но вот внешние, по отношению к нему, объекты приложения эту информацию могут получать и как то обрабатывать.
Одним из ярких примеров применения атрибутов может служить атрибут NonSerializedAttribute [4]. Данным атрибутом вы можете пометить поле своего класса и оно будет работать абсолютно так же, как и до пометки. Но если вы решите воспользоваться сериализатором уже имеющимся в инфраструктуре .Net, то данное поле в выходную последовательность не попадет. Ладно, про атрибуты чуть рассказал, по ссылкам кто хотел почитал, давайте собственно перейдем к примеру.
This blog post provides a simple utility class that will cluster pushpins on a Bing Map control. This utility provides a way to achieve great performance with 1000s of pushpins.
The Bing Map control for Windows Phone 7 is a versatile control, allowing you to provide your users with an interactive map. The control has some very useful features such as Pushpins, which you can anchor to a map coordinate so that they move automatically as the user pans / zooms the map. However, I have found that in practice, if you have more than ~30 pushpins visible on a map, the pan / zoom performance starts to degrade (on a real device). Therefore, in order to provide the best user-experience, it is advisable to only render a handful of pushpins on the map at any one time.
This blog post describes a simple approach to clustering pushpins, as shown in the video below, which renders the location of ~500 juggling clubs worldwide:
The clustering code is very easy to use; just create a PushpinClusterer instance, pass your Pushpins, the map and the template to use for the clusters marker:
var clusterer = new PushpinClusterer(map, pins,
this.Resources["ClusterTemplate"] as DataTemplate);
В прошлой части было рассмотрено как подключить к NuGet локальный репозиторий. Это удобное решение для установки библиотек собственной разработки. Осталось разобраться как создать свой пакет.
Для его создания потребуется утилита “NuGet.exe Command Line”, которую можно загрузить с официальной страницы проекта на CodePlex.Скопируем её в папку, доступную из командной строки. В качестве подходящего места может выступить “(Program files)\Microsoft Visual Studio 10.0\Common7\Tools\”.
Давайте откроем Visual Studio 2010 и посмотрим на настройки NuGet. Для этого можно или выбрать пункт меню “Tools > Library Package Manager > Package Manager Settings” или воспользоваться кнопкой “Package Manager Settings”, расположенной в окне консоли NuGet. Как можно заметить, в появившемся диалоге есть две страницы с настройками. Read more »
Самый простой способ создать свой источник установочных пакетов NuGet – использовать общую папку. Как это сделать подробно описано в статье “Локальный репозиторий″. Однако это далеко не всегда лучший вариант. Например, если необходимо обеспечить доступ через интернет. Давайте рассмотрим как можно быстро развернуть свой NuGet-сервер.