首页 > 解决方案 > 具有多个渲染器的 GTK# TreeViewColumn

问题描述

我正在使用 GTK# GUI 与 Mono C# 上的贴纸聊天。在谷歌搜索时,我发现为此目的最好的小部件是 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 或附加值,以便图片将显示在与消息相同的列中?或者也许有一个更好的小部件用于此目的?

标签: c#monogtk#

解决方案


你是对的,我已经能够做到这一点(单列中的多个项目),遵循(或推断)Mono's Gtk# tree view tutorial

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 存储库中找到此代码。我还在存储库的发布部分上传了一个可执行文件。

希望这可以帮助。


推荐阅读