GTK # TreeViewColumn с несколькими рендерами - PullRequest
0 голосов
/ 29 октября 2018

Я работаю в чате с наклейками на Mono C # с GTK # GUI.Во время поиска в Google я нашел лучший виджет для этой цели - TextView.Проблема при создании ListStore для столбца с несколькими средствами визуализации:

    TreeView messageLog=new TreeView();
    #Creating a column
    TreeViewColumn messageColumn = new TreeViewColumn();
    messageLog.AppendColumn(messageColumn);
    #Creating model for tree
    ListStore messageStore = new ListStore(typeof(string), typeof(Gdk.Pixbuf));
    messageLog.Model = messageStore;
    #Packing 2 renderers into column
    CellRendererText textCell = new CellRendererText();
    messageColumn.PackEnd(textCell, true);
    messageColumn.AddAttribute(textCell, "text", 0);
    CellRendererPixbuf stickerCell = new CellRendererPixbuf();
    messageColumn.PackStart(stickerCell, false);
    messageColumn.AddAttribute(stickerCell, "pixbuf", 1);

Добавление текста в TreeView:

    messageStore.AppendValues(value);

Таким образом, я могу добавлять изображения в TreeView только с:

    messageStore.AppendValues(null, new Gdk.Pixbug("red.png");

Но это показывает, как в новом столбце.Есть ли лучший способ определить ListStore или добавить значения, чтобы изображение отображалось в том же столбце, что и сообщение?А может для этого есть лучший виджет?

1 Ответ

0 голосов
/ 30 октября 2018

Вы были правы, я смог это сделать (более одного элемента в одном столбце), следуя (или выводя из) учебнику по Mono Gtk # tree .

namespace TreeViewMultipleRenderers
{
    public class MainWindowView: Gtk.Window
    {
        public MainWindowView()
            : base( Gtk.WindowType.Toplevel )
        {
            this.SetGeometryHints( this,
                                  new Gdk.Geometry { MinHeight = 400, MinWidth = 600 },
                                  Gdk.WindowHints.MinSize );

            this.Build();
        }

        void BuildIcons()
        {
            this.IconYes = new Gdk.Pixbuf(
                System.Reflection.Assembly.GetEntryAssembly(),
                "TreeViewMultipleRenderers.Res.yes.png", 16, 16 );

            this.IconNo = new Gdk.Pixbuf(
                System.Reflection.Assembly.GetEntryAssembly(),
                "TreeViewMultipleRenderers.Res.no.png", 16, 16 );
        }

        Gtk.TreeView BuildTreeView()
        {
            var toret = new Gtk.TreeView();

            // Index column
            var columnIndex = new Gtk.TreeViewColumn {
                Title = "#"
            };

            var indexRenderer = new Gtk.CellRendererText();
            columnIndex.PackStart( indexRenderer, expand: true );
            columnIndex.AddAttribute( indexRenderer, "text", 0 );

            // Data column
            var columnData = new Gtk.TreeViewColumn {
                Title = "Mixed column"
            };

            var dataRenderer1 = new Gtk.CellRendererPixbuf();
            columnData.PackStart( dataRenderer1, expand: false );
            columnData.AddAttribute( dataRenderer1, "pixbuf", 1 );

            var dataRenderer2 = new Gtk.CellRendererText();
            columnData.PackStart( dataRenderer2, expand: true );
            columnData.AddAttribute( dataRenderer2, "text", 2 );

            toret.AppendColumn( columnIndex );
            toret.AppendColumn( columnData );

            // Model
            var store = new Gtk.ListStore( typeof( string ), typeof( Gdk.Pixbuf ), typeof( string ) );
            toret.Model = store;

            store.AppendValues( "1", this.IconYes, "works" );
            store.AppendValues( "2", this.IconNo, "does not work" );

            return toret;
        }

        void Build()
        {
            this.BuildIcons();

            this.TreeView = this.BuildTreeView();

            this.Add( this.TreeView );
        }

        public Gtk.TreeView TreeView {
            get; set;
        }

        public Gdk.Pixbuf IconYes {
            get; private set;
        }

        public Gdk.Pixbuf IconNo {
            get; private set;
        }
    }
}

Я не вижу какой-либо важной разницы с соответствующими частями кода, который вы разместили, поэтому я думаю, что проблема должна быть в другом месте.Вы можете найти этот код в GtkTreeViewMultipleRenderers Github хранилище .Я также загрузил исполняемый файл в разделе релизов хранилища .

Надеюсь, это поможет.

...