gpt4 book ai didi

c# - GTK# 中的自定义树单元格渲染器 - 如何获取单元格数据?

转载 作者:行者123 更新时间:2023-11-30 21:10:48 25 4
gpt4 key购买 nike

我在 GTK# 中使用 TreeView,现在我需要使用自定义单元格渲染器。

虽然我几乎完成了所有工作,但还缺少一个部分:单元格渲染器必须知道要渲染什么。

要呈现的数据是自定义类。我想从该类中检索一个字段。

这是我目前所拥有的

public class TreeItemCellRenderer : CellRenderer
{
public override void GetSize (Widget widget, ref Gdk.Rectangle cell_area, out int x_offset, out int y_offset, out int width, out int height)
{
base.GetSize (widget, ref cell_area, out x_offset, out y_offset, out width, out height);

height = 16;
}

protected override void Render (Gdk.Drawable window,
Widget widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gdk.Rectangle expose_area, CellRendererState flags)
{
base.Render (window, widget, background_area, cell_area, expose_area, flags);

using (var layout = new Pango.Layout(widget.PangoContext)) {
layout.Alignment = Pango.Alignment.Left;
layout.SetText("Hello, World!");

StateType state = flags.HasFlag(CellRendererState.Selected) ?
widget.IsFocus ? StateType.Selected : StateType.Active : StateType.Normal;

window.DrawLayout(widget.Style.TextGC(state), cell_area.X, cell_area.Y, layout);
}
}
}

现在我想绘制自定义字段而不是“Hello, World!”。一些谷歌搜索建议 SetProperty/GetProperty 是我需要的,但是:

var col = new TreeViewColumn("TreeItem", renderer);
col.AddAttribute(renderer, "tree-item", 0);

在运行时抛出错误,因为 TreeItemCellRenderer 没有名为“tree-item”的属性。此外,值得注意的是 SetProperty 不是虚拟的。

那我应该怎么做呢?

最佳答案

实际上,唯一的问题是定义要在自定义单元格渲染器中渲染的值/数据不是在渲染器本身中完成的,而是在外部的监听器方法中完成的。

在您定义 TreeView 及其列和 CellRenderer 的小部件类中,您还可以定义一个 TreeCellDataFunc,它只不过是一个在呈现单元格之前调用的监听器函数的邪恶隐藏名称。但它的名称中已经包含“数据”,这就是您应该在该函数中执行的操作:提供要呈现的数据。

TreeItemCellRenderer cellRenderer = new TreeItemCellRenderer();
column.SetCellDataFunc(cellRenderer, new Gtk.TreeCellDataFunc(AwesomeDataFunction));

/**
* Supplies the TreeItemCellRenderer with data for the current cell.
* */
private void AwesomeDataFunction(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
{
(cell as TreeItemCellRenderer).<some self-declared property> = <any fitting value>;
}

您可能希望使用迭代器和模型来获取所需的数据。 CellRenderer 的实际 Render() 函数在该函数之后调用。

总而言之,我认为整个 TreeView/CellRenderer 模型一团糟。虽然它确实有效并且您可以用它做大部分事情,但完全不清楚您应该做什么来实现您的目标。那个 TreeView 教程还不错,但实际上只展示了冰山一角。为什么没有小部件用于单元格渲染超出了我的范围。这会容易得多。

关于c# - GTK# 中的自定义树单元格渲染器 - 如何获取单元格数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8274149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com