Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
роекты, на которых был выбран именно этот подход к написанию UI были самыми приятными из всех, в которых я участвовал. К несчастью, им мало кто пользуется. Но пользуются. Антивирусы Norton, Yahoo Messenger, Nod32, EverNote, линейка продуктов Mozilla (с оговорками).
Все стандартизированоСерьёзно? Это не так, даже если вы пишете под единственный браузер.
не нужно каждый раз изучать заново очередной монструозный фреймворк от проекта к проектуДа ладно? Вы в 2005 году, чтоль? У нас каждый день новый js фреймворк а-ля react/angular/etc, а каждый месяц «модным» становится другой.
стили отделены от разметкиБез shadow DOM это огромный костыль и тот самый неиссякаемый источник проблем и уродств. В WPF это разделение сделано гораздо лучше.
UI можно генерировать прямо из XML с помощью XSLT-преобразованийПока вы верстаете свою домашнюю страничку, да. А когда вы находете на SO ответ «модифицируйте HTML» все ваши мечты и идеалы разбиваются об этот ваш любимый HTML+CSS.
совершенно понятное и простое как пять копеек DOM-деревоПростой, за исключением before, after, стилей по-умолчанию, текстовых нодов. Теперь ещё shadow DOM, не забывайте!
Недавно nodejs + скрестили с хромиумом, чтобы писать десктопные приложения.Не нещадно тормозящий Electron-редактор появился впервые у майкрософта в виде VSO. 10 вкладок, Notepad++: 5 МБ памяти; 10 вкладок, VSO: 500 МБ памяти.
Не нещадно тормозящий Electron-редактор появился впервые у майкрософта в виде VSO. 10 вкладок, Notepad++: 5 МБ памяти; 10 вкладок, VSO: 500 МБ памяти.
при переименовании свойств можно забыть изменить константы в условияхопять же, решарпер выскажет подозрения при переименовании и предложит переименовать эту константу тоже. А вообще такой код конечно плохой, лучше использовать RX :-)
Время, затраченное Dispatcher.Invoke сверх «полезной» нагрузки при вызове из того же потока, к которому принадлежит Dispatcher — 0.2 мкс на один вызов.
Тот же показатель, но при вызове из другого потока — 26 мкс на вызов.
private void TestPerformance(object param)
{
Task.Run(() => TestPerformanceInternal());
}
private void TestPerformanceInternal()
{
int iterations = 1000000;
var sw = new Stopwatch();
var csw = new Stopwatch();
sw.Start();
for (int i = 0; i < iterations; i++)
{
csw.Start();
_dispatcher.Invoke(() =>
{
csw.Stop();
});
}
sw.Stop();
long crossThreadTiming = csw.ElapsedMilliseconds;
long invokeTiming = sw.ElapsedMilliseconds;
MessageBox.Show(string.Format("Cross-thread timing per call: {0} mcs\nFull invoke timing per call: {1} mcs",
(double)crossThreadTiming * 1000 / iterations,
(double)invokeTiming * 1000 / iterations));
}
Утечки на событиях
Объяснение реализации паттерна Weak Events выходит за рамки этот статьи, поэтому просто укажу ссылку, где эта тема рассмотрена очень подробно: www.codeproject.com/Articles/29922/Weak-Events-in-C.
public class CustomComboBox : ComboBox
{
public CustomComboBox()
{
SetResourceReference(StyleProperty, typeof(ComboBox));
}
}
Подводные камни WPF