Очевидно, в вашем дизайне есть понятие «один-единственный шрифт для всех этикеток». Всякий раз, когда вы думаете об одном-единственном, вы должны думать либо о классе stati c, либо о синглтоне. У обоих есть свои преимущества и недостатки. Какой из них вы выберете, выходит за рамки этого вопроса
В любом случае, этот единственный LabelFont имеет метод для изменения шрифта, и после его установки возникает событие.
class LabelFont
{
private Font labelFont; // TODO: consider to initialize with a proper default value.
public event EventHandler LabelFontChanged;
protected virtual void OnLabelFontChanged()
{
this.LabelFontChanged?.Invoke(this, EventArgs.Empty);
}
public Font LabelFont
{
get => this.labelFont;
set
{
this.labelFont = value;
this.OnLabelFontChanged;
}
}
}
Нам нужен метод с вводом последовательности элементов управления и выходом: эта последовательность элементов управления плюс все дочерние элементы управления и дочерние элементы управления и т. Д. c
public static IEnumerable<Control> ToDecendants(this IEnumerable<Control> controls)
{
foreach (Control control in controls)
{
// first return this control
yield return control
// then return decendants of the child controls
IEnumerable<Control> decendants = control.Controls
.Cast<Control>();
.ToDecendants();
foreach (Control decendant in decendants)
{
foreach (Control decendant in decendants)
yield return decendant;
}
}
}
Возможно, вы сможете что-то сделать с LINQ и SelectMany. Не забудьте добавить сам элемент управления, а не только дочерние элементы (что сделает SelectMany)
Каждую TemplateForm необходимо уведомлять всякий раз, когда изменяется один-единственный LableFont
class TemplateForm
{
private static LabelFont LabelFont => ... // get either static, or singleton
public TemplateForm()
{
...
// get notified when the LableFont changes
LabelFont.LabelFontChanged += OnLabelFontChanged;
}
// TODO: Dispose: desubscribe from LabelFontChanged
private void OnLableFontChanged(object sender, EventArgs e)
{
LabelFont labelFont = (LabelFont) sender; // if singleton, otherwise use static
Font labelFont = labelFont.LabelFont;
IEnumerable<Control> decendants = this.Controls.Cast<Control>
.ToDecendants();
foreach (Control decendant in decendants)
{
decendant.Font = labelFont;
}
}
Или если вы хотите обновить только шрифт элементов управления Label:
IEnumerable<Control> labelDecendants= this.Controls
.Cast<Control>
.ToDecendants()
.OfType<Label>();