问题描述
我正在尝试找到我之前提出的问题的解决方案:在Xamarin.Mac应用程序
I am trying to find a solution to this question I asked earlier: Populate SourceList in Xamarin.Mac app
我目前正在尝试实现NSOutlineViewDelegate
的GetView
方法,以查看是否可以在我拥有的OutlineView中创建一些文本.
I am currently trying to implement the GetView
method of the NSOutlineViewDelegate
to see if that may create some text in the OutlineView I have.
但是我一直坚持尝试向NSView对象添加内容.当我看示例OutlineView(将其拖到窗口中时,默认情况下会看到一个示例),每个项目都有一个TableCellView
.结构看起来像这样(首先是标题,然后是常规项目):
But I am stuck at trying to add stuff to the NSView object. When I look at the example OutlineView (the one you get by default when you drag it onto your window), there's a TableCellView
for each item. The structure looks like this (header first, then regular item):
Table Cell View
Static Text - HEADER CELL
Text Field Cell - HEADER CELL
Table Cell View
Image View
Image Cell
Static Text - Table View Cell
Text Field Cell - Table View Cell
到目前为止,我的方法如下:
So far my method looks like this:
public override NSView GetView (NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)
{
var navigation = item as Navigation;
var cell = new NSTableCellView();
if (navigation.IsHeader) {
} else {
}
return cell;
}
我的第一个猜测是标题的内容,例如,我创建一个NSTableHeaderCell
并将StringValue
属性设置为navigation.Name
.但是我不知道如何将其作为孩子添加到我的NSTableViewCell
.
My first guess what that for the header, for example, I create a NSTableHeaderCell
and set the StringValue
property to navigation.Name
. But I have no idea how to then add it as a child to my NSTableViewCell
.
还是我要以一种完全错误的方式来解决这个问题?我是Mono和Xamarin的新手(仅使用WPF和XAML完成过C#和Visual Studio),而我以前从未在Objective-C中完成过编程(因此花了我一段时间才弄清楚方法/类的奇怪语法) ).
Or am I going about this the completely wrong way? I am very new to Mono and Xamarin (have only done C# and Visual Studio using WPF and XAML) and I have never before done programming in Objective-C before (so it took me a while to figure out the weird syntax for methods/classes).
推荐答案
您将在XCode中看到Table Cell View
对象具有可以设置的标识符".就我而言,我有"HeaderCell"和"DataCell".
You'll see in XCode that the Table Cell View
objects have an 'Identifier' that you can set. In my case I have 'HeaderCell' and 'DataCell'.
我的代码如下:
public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)
{
if(IsGroupItem(outlineView, item))
{
return outlineView.MakeView("HeaderCell", this);
}
return outlineView.MakeView("DataCell", this);
}
这将创建XCode中定义的TableCellView
的适当实例.
This will create an appropriate instance of the TableCellView
defined in XCode.
就我而言,我使用Cocoa绑定而不是数据源,因此我的视图自动填充了数据.这可能是您要研究的一种方法,因为它与WPF/XAML数据绑定方法非常接近.但是,它具有陡峭的学习曲线,并且难以调试(例如WPF/XAML数据绑定!).
In my case, I use Cocoa bindings rather than a data source, so my views get populated with data automatically. This may be an approach you want to investigate because it is much closer to the WPF/XAML way of databinding. However, it has a steep learning curve and is difficult to debug (like WPF/XAML databinding!).
您不仅可以返回单元格,还可以访问它的子视图并进行适当设置.像这样:
Instead of simply returning the cell, you could access it's subviews and set them up appropriately. Something like:
var dataView = outlineView.MakeView("DataCell", this);
((NSImageView)dataView.Subviews[0]).Image = // assign an image
((NSTextField)dataView.Subviews[1]).StringValue = // assign your text
return dataView;
(注意:我只是从脑海中键入内容,它可能无法按原样工作-但希望您能理解这个想法)
(Note: I just typed that from the top of my head, it may not work as-is - but hopefully you get the idea)
这篇关于在Xamarin Studio中以编程方式创建NSView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!