Вы можете использовать Виджет . ModifyFont ( Pango.FontDescription fd ).Этот метод доступен во всех классах, поскольку он является производным от Widget .
Однако вы не можете изменить шрифт MenuBar и ожидать, что все дочерние элементы MenuItem Шрифты.Это даже не работает для MenuItem : вы должны изменить Label внутри него, обычно доступный для MenuItem.Child .
Iподготовили пару функций, которые делают трюк:
public static void ChangeContainerFont(Gtk.Container container, string fontDesc)
{
ChangeWidgetFont( container, fontDesc );
foreach(Gtk.Widget subw in container.Children) {
ChangeWidgetFont( subw, fontDesc );
if ( subw is Gtk.MenuItem menuItem ) {
var subMenu = menuItem.Submenu;
ChangeContainerFont( menuItem, fontDesc );
if ( subMenu is Gtk.Container subContainer ) {
ChangeContainerFont( subContainer, fontDesc );
} else {
if ( subMenu != null ) {
ChangeWidgetFont( subMenu, fontDesc );
}
}
} else
if ( subw is Gtk.Container subContainer ) {
ChangeContainerFont( subContainer, fontDesc );
}
}
}
public static void ChangeWidgetFont(Gtk.Widget w, string fontDesc)
{
w.ModifyFont( Pango.FontDescription.FromString( fontDesc ) );
}
Вы можете программно вызвать ChangeContainerFont (c, s) после создания пользовательского интерфейса (дайте вашей строке меню интуитивно понятное имянапример, menuBar ):
ChangeContainerFont( menuBar, "Times 22" );
Это будет проходить через все MenuItem внутри, останавливаясь, как только он достигает виджета, который не является контейнером.Например, MenuBar или MenuItem являются контейнерами (первый содержит MenuItem , второй содержит по крайней мере Label ), а Метка отсутствует.
Надеюсь, это поможет.