Macos 尽管需要显示,但未调用Xamarin.Mac NSView DrawRect

Macos 尽管需要显示,但未调用Xamarin.Mac NSView DrawRect,macos,appkit,xamarin.mac,Macos,Appkit,Xamarin.mac,我试图创建一个视图,表示在另一个视图中水平移动的垂直线 我有以下ViewController和自定义视图 使用系统; 使用系统计时器; 使用AppKit; 使用核心图形; 命名空间自定义控制实验 { 公共部分类ViewController:NSViewController { 私人定时器; 专用线路控制_线路控制; 公共视图控制器(IntPtr句柄):基本(句柄) { } 公共覆盖无效ViewDidLoad() { base.ViewDidLoad(); var frame=new CGRect

我试图创建一个视图,表示在另一个视图中水平移动的垂直线

我有以下ViewController和自定义视图

使用系统;
使用系统计时器;
使用AppKit;
使用核心图形;
命名空间自定义控制实验
{
公共部分类ViewController:NSViewController
{
私人定时器;
专用线路控制_线路控制;
公共视图控制器(IntPtr句柄):基本(句柄)
{
}
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
var frame=new CGRect{X=0,Y=0,Height=ContentView.frame.Height,Width=1};
_线条控制=新线条控制(框架);
AddSubview(_lineControl);
_定时器=新定时器(500);
_timer.appeated+=\u timer\u appeated;
_timer.Start();
}
私有无效时间已过(对象发送方,ElapsedEventArgs e)
{
_lineControl.Position++;
}
}
公共类LineControl:NSView
{
私人浮动头寸;
公用线路控制(CGRect frameRect):基本(frameRect)
{
初始化();
}
私有void初始化()
{
WantsLayer=true;
}
公共覆盖无效DrawRect(CGRect dirtyRect)
{
控制台。WriteLine(“DrawRect”);
base.DrawRect(dirtyRect);
var context=NSGraphicsContext.CurrentContext?.CGContext;
if(上下文==null)
{
返回;
}
变量高度=帧高度;
SetStrokeColor(新的CGColor(.5f、.6f、.7f));
上下文。设置线宽(1f);
SetLineDash(0,新的nfloat[]{3,3});
context.MoveTo(0,0);
context.AddLineToPoint(0,高度);
StrokePath();
}
公众浮动头寸
{
get=>\u位置;
设置
{
_位置=值;
Console.WriteLine(“位置=”+_位置);
NeedsDisplay=true;
}
}
}
}
第一次运行程序时调用DrawRect一次。之后,它不会再次调用,尽管位置会增加,并且需要设置显示


我做错了什么?

在线程池线程上运行
System.Timers.Timer
已用事件-在主线程之外设置
needsDisplay
是不合法的。如果您在Xcode中尝试此操作,则这是来自线程消毒剂的运行时错误

您需要修改代码,以便从主线程更新
Position
,或者将set
needsDisplay
调用封送到主线程上


在.NET和Xamarin中有多种方法,其中一个文档建议使用
InvokeOnMainThread
(它适用于iOS,但我相信它也适用于macOS)。

我不知道这是否是问题的原因,但您的
系统。Timers
timer
运行事件是在线程池线程上运行的。在主线程之外设置
needsDisplay
是不合法的。如果您尝试在Xcode中执行此操作,则会从线程消毒剂中获得运行时错误。您需要从主线程更新
Position
,或者将set
needsDisplay
调用封送到主线程上。我确实想到了这一点,但还没有对其进行调查,因为在其他情况下,我有一个例外。所以它默默地失败了。总之,很棒的东西,谢谢。请发帖回答:)