C# 在Xamarin Studio中以编程方式创建NSView
我正试图找到一个解决我先前提出的这个问题的方法: 我目前正在尝试实现C# 在Xamarin Studio中以编程方式创建NSView,c#,macos,cocoa,mono,xamarin,C#,Macos,Cocoa,Mono,Xamarin,我正试图找到一个解决我先前提出的这个问题的方法: 我目前正在尝试实现NSOutlineViewDelegate的GetView方法,看看这是否会在我的OutlineView中创建一些文本 但我一直在尝试向NSView对象添加内容。当我查看示例OutlineView(将其拖到窗口上时默认得到的示例)时,每个项目都有一个TableCellView。结构如下所示(首先是标题,然后是常规项): 到目前为止,我的方法如下所示: public override NSView GetView (NSOutli
NSOutlineViewDelegate
的GetView
方法,看看这是否会在我的OutlineView中创建一些文本
但我一直在尝试向NSView对象添加内容。当我查看示例OutlineView(将其拖到窗口上时默认得到的示例)时,每个项目都有一个TableCellView
。结构如下所示(首先是标题,然后是常规项):
到目前为止,我的方法如下所示:
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;
}
public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, NSObject item)
{
if(IsGroupItem(outlineView, item))
{
return outlineView.MakeView("HeaderCell", this);
}
return outlineView.MakeView("DataCell", this);
}
我的第一个猜测是,例如,我创建了一个NSTableHeaderCell
,并将StringValue
属性设置为navigation.Name
。但我不知道如何将其作为子项添加到我的NSTableViewCell
还是我完全错了?我对Mono和Xamarin非常陌生(只使用WPF和XAML编写过C#和Visual Studio),而且我以前从未使用Objective-C编写过程序(因此我花了一段时间才弄清楚方法/类的奇怪语法)。您将在XCode中看到,
表单元格视图
对象有一个可以设置的“标识符”。就我而言,我有“HeaderCell”和“DataCell”
我的代码如下所示:
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;
}
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
的适当实例
在我的例子中,我使用Cocoa绑定而不是数据源,因此我的视图会自动填充数据。这可能是您想要研究的一种方法,因为它更接近WPF/XAML的数据绑定方式。然而,它有一个陡峭的学习曲线,并且很难调试(比如WPF/XAML数据绑定!)
您可以访问它的子视图并进行适当的设置,而不是简单地返回单元格。比如:
var dataView = outlineView.MakeView("DataCell", this);
((NSImageView)dataView.Subviews[0]).Image = // assign an image
((NSTextField)dataView.Subviews[1]).StringValue = // assign your text
return dataView;
(注意:我只是从头顶上键入了这一点,它可能无法按原样工作-但希望您能理解)当用户编辑了某个项目文本字段的字符串值时,此覆盖或其他覆盖是否能够检测到?@salgarcia请看下面的问题: