У меня есть UserControl1 и UserControl2. В UserControl2 стоит FontDialog. Мне нужно, чтобы текст изменился во всей программе, а не только в UserControl2.
Тип System.Drawing.Font не позволяет менять свои свойства, только заменять объект целиком, поэтому никаких вариантов, кроме ручного обхода нужных контролов и ручной установки им нового шрифта нет.
Для кастомных UserContorl можно сделать класс Settings с полем Font (ну и что там еще понадобится, цвет например), реализовать в данном классе интерфейс INotfyPropertyChanged, добавить ссылку на единственный инстанс данного класса (реализовать как синглтон?) во все UserContorl и подписаться на событие изменения поля Font. Тогда изменив шрифт в настройках - он поменяется во всех, подписанных на это событие, контролах. Однако даже такой подход не избавит от необходимость ручного прописывания нового шрифта вложенным контролам.
Если хотите менять стиль оформления налету в WinForms - либо все-все-все руками, либо берете готовый фреймворк с поддержкой стилей, вроде DevExpress, перестаете страдать от ручной реализации поддержки стилей и начинаете страдать от "тараканов", ой простите, "уникальных особенностей" выбранного фреймворка, разрастания количества сторонних библиотек, которые вы не используете напрямую или вообще не используете, но не можете выкинуть потому что фреймворк и т.д. и т.п.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей