GTK#TreeViewColumn具有多个渲染器

时间:2018-10-28 21:48:53

标签: c# mono gtk#

我正在使用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或附加值,以便图片将在与消息相同的列中显示?还是为此目的有一个更好的小部件?

1 个答案:

答案 0 :(得分:0)

您是对的,在Mono's Gtk# tree view tutorial之后(或从GtkTreeViewMultipleRenderers Github repository推断出来),我已经做到了(单列中有多个项目)。

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;
        }
    }
}

我看不到与您发布的代码的相关部分有什么重要的区别,因此我想问题一定在其他地方。您可以在releases section of the repository中找到此代码。我还在{{3}}中上传了一个可执行文件。

希望这会有所帮助。