TreeView: Pango.Alignment не работает

И еще одна проблема с TreeView, нужно было использовать qt;)

У меня есть TreeView, в котором я использую следующую функцию для рендеринга текста:

private void RenderEntryValue (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
{
      (cell as Gtk.CellRendererText).Markup = "" + someMarkupText;
      (cell as Gtk.CellRendererText).Alignment = Pango.Alignment.Center;
}

Как вы могли догадаться из Темы, это не работает. Текст остается выровненным по левому краю. Любые идеи, как заставить его работать, кроме добавления пробелов слева от него?

В коде нет другого места, которое могло бы что-либо сделать с TreeView, кроме добавления и выделения столбцов. И нигде там не задано выравнивание.


person TheSHEEEP    schedule 11.03.2012    source источник


Ответы (2)


Кажется, что alignment влияет только на выравнивание текста внутри макета. Поскольку ширина макета равна ширине содержащегося в нем текста, alignment вообще ничего не делает, если нет нескольких строк.

Чтобы на самом деле получить текст по центру столбца, вам также нужно установить xalign = 0.5f, таким образом:

private void RenderEntryValue (Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
{
    (cell as Gtk.CellRendererText).Markup = "" + someMarkupText;
    (cell as Gtk.CellRendererText).Alignment = Pango.Alignment.Center;
    cell.Xalign = 0.5f;
}
person Connor    schedule 20.07.2012

Хотя это и не решение, я, по крайней мере, нашел обходной путь в виде пользовательского CellRenderer. Каким-то образом это помещает текст не в центр, а на несколько пикселей слева от него, но это все же намного лучше, чем полное игнорирование выравнивания;)

public class CellRendererAlignedText : CellRendererText
{
    /**
     * Overridden render method to position text correctly.
     * */
    protected override void Render (Gdk.Drawable window, 
                                    Widget widget, 
                                    Gdk.Rectangle background_area, 
                                    Gdk.Rectangle cell_area, 
                                    Gdk.Rectangle expose_area, 
                                    CellRendererState flags)
    {
        if (Alignment == Pango.Alignment.Center)
        {   
            cell_area.X += background_area.Width/4;
            cell_area.Width /= 2;
        }
        base.Render (window, widget, background_area, cell_area, expose_area, flags);
    }
}
person TheSHEEEP    schedule 25.03.2012