gpt4 book ai didi

c# - 在 C# MonoMac 中动态创建控件/对象(NSButton、NSLabel)

转载 作者:太空狗 更新时间:2023-10-29 23:30:45 33 4
gpt4 key购买 nike

我正在尝试在代码中创建一个 NSButton 和一个 NSLabel。我能够创建它,但我不知道应该将它添加到哪里,然后将它连接起来以进行连接。

我不想使用 XCode(带 Interface Builder),因为这些控件需要动态实例化。

  • 我应该在 mainWindowController 的 NSApplicationDelegate 中添加按钮吗?
  • 我是否将其连接到“Window.cs”文件?

有人能给我指明正确的方向,以便在 MonoMac/C# 中动态创建和连接对象吗?

提前致谢,伊夫

最佳答案

在 Apple 文档和 Xamarin 文档中进行研究后,我想到了以下解决方案。我不知道它是否适用于更复杂的场景,但这是一个开始。

我不知道这是否是最佳做法。无论哪种方式,我希望这也能帮助其他人。如果我找到更多信息,我将对此进行更新。


创建 AppDelegate

一些介绍

显示窗口

AppDelegate 类将创建窗口和其他 NSObject(例如 NSButton 等)

首先覆盖方法 FinishedLaunching - 在该方法中我们创建窗口 (NSWindow) - 请参见 var window = new NSWindow(... )。之后有一些样板要

  1. 使窗口从左上角开始显示 window.CascadeTopLeftFromPoint (new PointF (20, 20));
  2. 使用 window.MakeKeyAndOrderFront (null);
  3. “显示”窗口

创建按钮

CreateCloseButton() 方法将生成一个按钮,其标题、外观等都已设置。有关选择 BezelStyle 的简单指南,请查看此链接:[ http://psionides.eu/2014/10/06/a-guide-to-nsbutton-styles/ ].

将按钮添加到窗口

这部分又在 FinishedLaunching 方法中。采取的步骤:

  1. 为按钮的“ subview ”创建一个矩形(或 RectangleF)。这意味着在按钮所在的位置创建一个矩形。如果你把它做得太小,按钮将不会完全显示,但它会有一些缺失的边缘。代码是 var closeButtonRect = new RectangleF (8, 8, closeButtonSize.Width, closeButtonSize.Height);
  2. 接下来,我们必须让我们的按钮知道这个矩形是它将存在的地方,方法是:closeButton.Frame = closeButtonRect;
  3. 然后我们将按钮(或 NSView)添加到我们的窗口。 window.ContentView.AddSubview (closeButton);.

将点击事件连接到按钮

这部分又在 FinishedLaunching 方法中。但它可以很容易地在别处设置。基本上这作为 C# 事件(见下面的片段)。

// Attach an event to the button. When "Activated" / "Clicked" it will close the application.
closeButton.Activated += (object sender, EventArgs e) => {
NSApplication.SharedApplication.Terminate(closeButton);
};

完整代码

AppDelegate 类

using System;
using System.Drawing;
using MonoMac.Foundation;
using MonoMac.AppKit;

namespace MonoMacTest02
{
public class AppDelegate : NSApplicationDelegate
{
public override void FinishedLaunching (MonoMac.Foundation.NSObject notification)
{
// Get the button
var closeButton = CreateCloseButton ();
// Get size and create rectangle for the view
var closeButtonSize = closeButton.Frame.Size;
var closeButtonRect = new RectangleF (8, 8, closeButtonSize.Width, closeButtonSize.Height);
// Apply the rectangle to the frame
closeButton.Frame = closeButtonRect;

// Attach an event to the button. When "Activated" / "Clicked" it will close the application.
closeButton.Activated += (object sender, EventArgs e) => {
NSApplication.SharedApplication.Terminate(closeButton);
};

// Creating the NSWindow object
var window = new NSWindow (
new RectangleF(0, 0, 400, 300), // Sets the size of the window
NSWindowStyle.Titled, // Style of the window
NSBackingStore.Buffered,
false
) {
// Adding a title
Title = "MonoMacTest02 (Adding a button)"
};

// Add our button to the window
// AddSubView expects an NSView object. All UI controls are derived from NSView, so we can add the 'closeButton' itself.
window.ContentView.AddSubview (closeButton);

window.CascadeTopLeftFromPoint (new PointF (20, 20));
window.MakeKeyAndOrderFront (null);
}

// Creating the button
private NSButton CreateCloseButton() {
var closeButton = new NSButton ();
closeButton.Title = "Close";
closeButton.BezelStyle = NSBezelStyle.Rounded;

closeButton.SizeToFit ();

return closeButton;
}
}
}

程序类(static void Main())

using System;
using MonoMac.AppKit;

namespace MonoMacTest02 {
public class Program {
static void Main(string[] args) {
NSApplication.Init();

var application = NSApplication.SharedApplication;
application.Delegate = new AppDelegate();
application.Run();
}
}
}

欢迎所有评论和建议。

关于c# - 在 C# MonoMac 中动态创建控件/对象(NSButton、NSLabel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28047933/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com