【问题标题】:Is there a Xamarin.Mac non-modal NSAlert dialog?是否有 Xamarin.Mac 非模态 NSAlert 对话框?
【发布时间】:2015-03-23 19:03:40
【问题描述】:

在 Xamarin.Mac 中,我可以轻松创建 NSAlert,并调用 RunModal()。问题是,这会占用 MainThread,并阻止其他东西运行。例如,如果 ThreadPool 中的一个线程调用 InvokeOnMainThread( delegate => { do_NSAlert_modal(); } );,我们真的希望 ThreadPool 线程成为唯一等待该对话的线程。

除了模态运行 NSAlert 是否有非阻塞替代方案?还是我需要创建一些新的自定义窗口来执行此功能?

【问题讨论】:

    标签: c# multithreading modal-dialog xamarin.mac nsalert


    【解决方案1】:

    你可以这样做: 不要调用 alert.RunModal(),而是这样做:

    NSApplication.SharedApplication.BeginSheet (alert.Window, this.WindowForSheet);
    

    关于第二个参数,您必须输入要为其附加警报窗口的窗口。就我而言,这是从 NSDocument 调用的。

    然后,当您关闭警报时,您可以从其他线程通过

    alert.Window.Close ();
    NSApplication.SharedApplication.EndSheet (alert.Window);
    

    在我的例子中,我在一个单独的线程上上传服务器上的一些数据时显示警报,然后在完成后关闭它(我也会使用一些肮脏的方法隐藏确定按钮)。如果你想让 ok 按钮可见,你可能需要调用第二行,即使你从警报的 ok 按钮关闭它(你必须自己测试)

    请注意 NSApplication.BeginSheet 和 EndSheet 在 10.10 中已弃用。 Apple 表示您必须改用 NSWindow.BeginSheet 和 EndSheet,方法是将其调用到要附加警报的窗口上。但还要注意,这两种方法仅在 10.10 上可用,因此,如果您也以 10.9 为目标(大多数开发人员仍然这样做),您现在必须使用已弃用的版本......这就是苹果弃用事物的方式 - 他们并不真正关心他们的应用开发者

    更新 似乎以这种方式警报不会自动调整大小。 RunModal 和 RunSheetModal 会调整警报的大小以适应内容。如果您希望它是非模态的,则必须使用 alert.Window.SetContentSize 以某种方式计算大小以适应。您可以遍历所有子视图并使用 alert.MessageText 检测 nstextfield 并计算大小以适应它并使用 frame.right + 10 来计算警报窗口应具有的大小。但这不保证适用于未来版本的 os x

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2013-12-06
      相关资源
      最近更新 更多