Сейчас на работе заставляют писать на WPF, но чтобы не забыть WinForms, буду рассматривать реализацию одних и тех же задач и в той, и в другой технологии.
Переопределение стандартных элементов управления
Как правило, стандартных элементов управления вполне хватает, чтобы написать приложение с UI. Если вдруг хочется сделать интерфейс нестандартным, то можно взять чужую библиотеку элементов, например DevExpress.
Но доработка стандартных контролов не такая уж и сложная вещь. Вполне по силам сделать и самому. Чем и предлагаю заняться. Реализую самое простое, что приходит в голову: чекбокс с нестандартным отображением.
CheckBox на WinForms
Здесь один способ. Надо реализовать свой класс:
class MyCheckBox: CheckBox { protected override void OnPaint(PaintEventArgs e) { // рисуем фон, текст, графику } }

CheckBox на WPF
В нашем распоряжение имеется уже два способа.
Первым идет дедовский способ:
class MyCheckBox: CheckBox { protected override void OnRender(DrawingContext dc) { //рисуем программно, аналогично WinForms } }
Второй вариант – переопределить шаблон элемента:
<Checkbox Template="{StaticResource myCheckBox}"/>
<Controltemplate x:Key="myCheckBox" TargetType="CheckBox">
<Border>…</Border>
<ControlTemplate.Triggers>…</ControlTemplate.Triggers>
</ControlTemplate>

Собственно вкратце это все. Исходные коды примера.
Во второй части буду рассматривать написание составных элементов.
