Создание дополнительного окна с помощью monomac/ C#
Я всюду искал ответ на этот вопрос, и хотя я понимаю, что он, вероятно, очень тривиален, каким-то образом ответ ускользает от меня.
Мне нужно показать второе окно (запускается при нажатии на пункт меню, если это имеет значение). Я прекрасно знаю, как это сделать с winforms, но я не уверен, что такое эквивалент monomac/NSWindow. Мне нужно сделать это:
MyWindowClass myWindow = new MyWindowClass();
myWindow.Show();
Лучшая информация, которую я могу найти по этому вопросу, говорит о том, что должно работать следующее:
MyWindowClass myWindow = new MyWindowClass();
myWindow.MakeKeyAndOrderFront(this);
Но когда я пытаюсь это сделать, он говорит мне, что MyWindowClass() нуждается в перегрузке, поэтому я смотрю на конструктор и вижу, что он запрашивает IntPtr. Не зная лучше, я пытаюсь это:
MyWindowClass myWindow = new MyWindowClass(new IntPtr());
myWindow.MakeKeyAndOrderFront(this);
Этот код будет работать без ошибок, но при попытке запустить окно ничего не происходит.
Я уверен, что просто делаю глупую ошибку, но я просто не смог ничего найти по этому вопросу. Любая помощь будет принята с благодарностью.
Редактировать: для справки, вот соответствующая часть конструктора:
public MyWindowClass (IntPtr handle) : base (handle)
{
Initialize ();
}
Дополнительная информация: я пытаюсь запустить приведенный выше код из AppDelegate.cs следующим способом:
partial void showWindow (MonoMac.Foundation.NSObject sender){
MyWindowClass myWindow = new MyWindowClass(new IntPtr());
myWindow.MakeKeyAndOrderFront(this);
}
ДАЖЕ БОЛЬШЕ КОДА ПОЧЕМУ
public partial class ViewPaths : MonoMac.AppKit.NSWindow
{
#region Constructors
public ViewPaths ()
{
Initialize();
}
// Called when created from unmanaged code
public ViewPaths (IntPtr handle) : base (handle)
{
Initialize ();
}
// Called when created directly from a XIB file
[Export ("initWithCoder:")]
public ViewPaths (NSCoder coder) : base (coder)
{
Initialize ();
}
// Shared initialization code
void Initialize ()
{
}
#endregion
}
И тогда актуальная реализация:
public partial class AppDelegate : NSApplicationDelegate
{
MainWindowController mainWindowController;
ViewPaths display;
public AppDelegate ()
{
}
public override void FinishedLaunching (NSObject notification)
{
mainWindowController = new MainWindowController ();
mainWindowController.Window.MakeKeyAndOrderFront (this);
}
partial void viewPaths (MonoMac.Foundation.NSObject sender){
display = new ViewPaths();
display.MakeKeyAndOrderFront(this);
}
}
}
Это показывает окно без каких-либо элементов пользовательского интерфейса.
2 ответа
Просто добавьте конструктор по умолчанию без параметра handle. Убедитесь, что MyWindowClass подклассы NSWindow и он должен работать.
Кроме того, вам может понадобиться сохранить ссылку на ваше окно myWindow, чтобы оно не собирало мусор.
Для ясности, вот окончательный код, который решил проблему, если кто-нибудь еще гуглит это:
Так как я создал новое окно monomac с контроллером, мне нужно было создать экземпляр этого контроллера и показать окно контроллера:
MyWindowController myWindow = new MyWindowController();
myWindow.Window.MakeKeyAndOrderFront(this);
Для этого не требовался новый конструктор без внедренного параметра дескриптора - это решение работало вокруг проблемы, которую я создал, создавая неправильную вещь.