【问题标题】:Instantiate an additional window with monomac/c#使用 monomac/c# 实例化一个附加窗口
【发布时间】:2013-01-17 22:24:30
【问题描述】:

我一直在寻找这个问题的答案,虽然我意识到这可能非常微不足道,但不知何故我却找不到答案。

我需要显示第二个窗口(从单击菜单项启动,如果这很重要)。我非常清楚如何使用 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);
    }

}

}

这显示了一个没有任何 UI 元素的窗口。

【问题讨论】:

    标签: c# objective-c xcode mono monomac


    【解决方案1】:

    只需添加一个没有句柄参数的默认构造函数。确保 MyWindowClass 是 NSWindow 的子类,它应该可以工作。

    此外,您可能需要保留对 myWindow 的引用 - 这样它就不会被垃圾收集。

    【讨论】:

    • 这就是我需要做的。谢谢!没有意识到我可以在 monomac 为我添加的构造函数之外添加一个额外的构造函数。
    • 实际上,这并没有按预期工作 - 它显示的是一个窗口,但不是我的窗口。编辑原始评论以显示课程。
    • 发现问题。我正在创建窗口的实例而不是 windowController。一切都好。谢谢!
    【解决方案2】:

    为了清楚起见,这是解决问题的最终代码,如果其他人用谷歌搜索过这个:

    由于我已经创建了一个带有控制器的新 monomac 窗口,我需要创建该控制器的一个实例,并显示控制器的窗口:

    MyWindowController myWindow = new MyWindowController();
    myWindow.Window.MakeKeyAndOrderFront(this);
    

    这不需要一个没有实现句柄参数的新构造函数 - 该解决方案正在解决我通过实例化不正确的东西而产生的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多