2015-03-23 1 views
0

В Xamarin.Mac, я могу легко создать NSAlert и позвонить по телефону RunModal(). Проблема в том, что это свирепствует MainThread и блокирует другие функции. Например, если поток из ThreadPool вызывает InvokeOnMainThread(delegate => { do_NSAlert_modal(); });, нам бы очень хотелось, чтобы поток ThreadPool был единственным потоком, ожидающим этого диалога.Есть ли неформальный диалог NSAlert от Xamarin.Mac?

Есть ли такая вещь, как неблокирующая альтернатива запуску NSAlert modally? Или мне нужно создать новое пользовательское окно для выполнения этой функции?

ответ

0

вы можете сделать это следующим образом: Вместо вызова alert.RunModal(), сделайте следующее:

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

О том, что второй параметр, вы должны кормить в окне, для которого вы хотите приложить окна предупреждения. В моем случае это было вызвано из NSDocument.

Затем, когда вы закрываете уведомление вы можете сделать это из другого потока с помощью

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

В моем случае, я показывал предупреждение, когда я загрузить некоторые данные на сервере в отдельном потоке, и затем закройте его, когда закончите (я также скрою кнопку ok, используя некоторые грязные методы). Если вы хотите, чтобы ok buctton был видимым, вам может потребоваться позвонить в эту вторую строку, даже если вы закроете его из кнопки ok предупреждения (вы должны будете сами это проверить)

Обратите внимание, что NSApplication.BeginSheet и EndSheet устарели в 10.10. Apple указывает, что вместо этого вы должны использовать NSWindow.BeginSheet и EndSheet, вызывая его в окне, к которому вы хотите подключить оповещение. Но также обратите внимание, что эти 2 метода доступны только на 10.10, поэтому, если вы также нацеливаете 10.9 (что большинство разработчиков все еще делает), вам придется идти с устаревшей версией на данный момент ... Вот как яблоко обесценивает вещи - они не заботятся об их разработчиках приложений

UPDATE Похоже, что таким образом предупреждение не изменяется автоматически. RunModal и RunSheetModal изменяют размер предупреждения, чтобы содержимое соответствовало. Если вы хотите, чтобы он был немодальным, вам придется вычислить размер, чтобы он каким-то образом соответствовал, используя alert.Window.SetContentSize. Вы можете либо пройти через все подзоны, либо обнаружить поле nstext с помощью alert.MessageText и вычислить размер, чтобы соответствовать этому, и использовать frame.right + 10 для вычисления того, что должно иметь окно предупреждения. Но это не гарантирует работу над будущей версией os x