воскресенье, 27 февраля 2011 г.

Переключение режима редактирования формы (WPF)

Довольно часто возникает необходимость отображения данных на форме в двух режимах: редактирование и только чтение. Проблема в том, что не у всех контролов есть свойство IsReadOnly. Более того, некоторые контролы трактуют значение этого свойства по своему (Например для ComboBox.IsReadOnly = True включает режим использования только для чтения, в котором содержимое поля со списком можно выбирать, но не редактировать. Т.е. значение под комбиком по прежнему можно менять.) Также имеет смысл в режиме “только чтение” заменять сложные контролы на простые, например вместо ComboBox и DatetimePicker отобразить TextBox или MaskedTextBox.
Допустим у нас есть некая форма редактирования контакта и мы хотим, что бы в режиме просмотра она выглядела чуть-чуть иначе.
Форма в режиме редактирования. Форма в режиме чтения.
О том как этого добиться с минимальными усилиями я и хочу рассказать.

воскресенье, 29 августа 2010 г.

Горячие клавиши в WPF

Недавно возникла необходимость реализовать в проекте функционал горячих клавиш. Сами сочетания клавиш должны храниться в отдельном хранилище (например в xml-файле) и не должны зависеть от текущего клавиатурного фокуса на форме. При этом в проекте используется паттерн M-V-VM и DelegateCommand.

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

понедельник, 17 мая 2010 г.

Code snippets

Когда стоит задача создать несколько десятков однотипных классов, волей-неволей задумываешься о том как эту работу можно ускорить? Для этого существуют разные способы, начиная с копи-паста и заканчивая кодогенерацией…
Копи-паст чреват ошибками, и вообще считается злом :-). Кодогенерация вещь отличная, но… ее еще надо освоить…
Я хочу рассказать об одном из промежуточных вариантов – о сниппетах.

вторник, 27 апреля 2010 г.

Новый домен

Как-то почти случайно взял да и приобрел себе домен... Сегодня перевел на него свои блоги. Так что у блога теперь такой адрес: http://alex.algel.name.

"Почти случайно" потому, что делать этого в ближайшее время как-то не планировал вовсе... То есть, конечно, было желание заиметь свой домен, но вроде бы как и не к спеху... А пару дней назад, блуждая по просторам интернета, зашел на сайт регистратора и вышел оттуда уже со своим доменом =)

Теперь сижу и думаю: "И нафига?"

Кстати у них на сайте, помимо регистрации доменов, есть возможность увидеть освобождающиеся домены, а так же можно посмотреть кто и когда владел интересующим вас доменом

Еще, столкнулся с досадной неприятностью... Поскольку адрес сайта сменился, то автоматом поменялся OpenID, и те сайты, на которых я ранее регистрировался со старым адресом, теперь воспринимают меня как нового пользователя...

воскресенье, 18 апреля 2010 г.

Создаем дерево.

Иногда приходится сталкиваться с необходимостью отобразить на форме иерархичные данные в виде дерева. При этом сами данные хранятся в базе данных в плоском виде (Id, ParentId, Name).
В WPF для отображения иерархичных данных предусмотрен специальный шаблон HierarchicalDataTemplate, но он требует чтобы передаваемые объекты содержали в себе коллекцию дочерних элементов. И вот тут встает вопрос о поиске оптимального алгоритма преобразования плоской коллекции в иерархичную. Парочку таких алгоритмов я и хочу здесь представить.

суббота, 20 марта 2010 г.

Composite Application Guidance for WPF and Silverlight

Пару дней назад Денис Гладких разместил на TechDays.ru отличный доклад по использованию CompositeWPF:

среда, 17 марта 2010 г.

Облегчаем добавление параметров к Uri

На codehelper.ru недавно возник вопрос по поводу того как сделать так, чтобы можно было конструировать сложные Url, с большим количеством параметров, в объектной манере. В ответ на это и родился очередной extension:

Copy Source | Copy HTML
  1. public static class UriExtensions {
  2.     public static Uri AddQueryParameter(this Uri uri, string name, object value) {
  3.         var builder = new UriBuilder(uri);
  4.         if(builder.Query!=null&&builder.Query.Length>1) {
  5.             builder.Query = string.Format("{0}&{1}={2}", builder.Query.Substring(1), name, value);
  6.         }else {
  7.             builder.Query = string.Format("{0}={1}", name, value);
  8.         }
  9.         return builder.Uri;
  10.     }
  11. }
  12.  

Теперь для конструирования Url можно написать такой код:

Copy Source | Copy HTML
  1. var uri = new Uri("http://alexey-algel.blogspot.com/search")
  2.         .AddQueryParameter("updated-max", new DateTime(2010, 1, 24, 23, 10,  0).ToString("yyyy-MM-ddTHH:mm:sszzz"))
  3.         .AddQueryParameter("max-results", 7);
  4. Console.WriteLine(uri.ToString());
  5.  

Который построит такой Url:

http://alexey-algel.blogspot.com/search?updated-max=2010-01-24T23:10:00+03:00&max-results=7