摩纳哥编辑器:使用本机(系统)上下文菜单
Monaco editor: Use native (system) context menu
有没有办法让 Monaco 为上下文菜单使用系统菜单?
我在 macOS 上的 WKWebView
中嵌入了 Monaco。
上下文(右键单击)菜单呈现在 Web 视图中,而不是作为本机系统菜单。 (但是 VSCode 显示本机上下文菜单。)
我怎样才能使这个工作?
这就是我想要的:(我在 VS Code 中看到的)
但我得到了这个:(我在嵌入式 WKWebView 中得到的)
编辑 2:
你可以看到这实际上是一个系统菜单,它呈现在包含 window 之外的方式。截图:
所以在深入研究了所有这些之后。这个答案将指导您如何实现这一目标。如果您在任何浏览器中查看 MonaEditor 渲染的 ContextMenu
,它总是被视口裁剪。
这是因为上下文菜单是基于HTML的,受视口限制。
那么为什么 VSCode 能够在 ViewPort 之外显示菜单?
这是因为 electron 具有显示本机菜单的功能。 VSCode 禁用 Monaco 自己的菜单并在右键单击时创建本机菜单。你可以在下面看到 npm 模块,它显示了如何
https://github.com/mixmaxhq/electron-editor-context-menu
现在,当您使用 WKWebView 时,您不能使用电子功能,因此这意味着您需要在 Swift 代码中本地实现上下文处理程序。以下是一些 SO 线程,它们将为您指明正确的方向
我使用以下代码创建了一个 Cocoa 应用程序,以确保该方法有效
//
// ViewController.swift
// WebViewTEst
//
// Created by Tarun Lalwani on 4/8/18.
// Copyright © 2018 Tarun Lalwani. All rights reserved.
//
import Cocoa
import WebKit
class ViewController: NSViewController {
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let url = "https://microsoft.github.io/monaco-editor/"
let prefs = self.webView.configuration.preferences
prefs.javaScriptEnabled = true
prefs.plugInsEnabled = true
self.webView.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5"
self.webView.configuration.preferences.setValue(true, forKey: "developerExtrasEnabled")
self.webView.load(URLRequest(url: URL(string: url)!))
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
然后通过 运行 editor.updateOptions({contextmenu: false})
禁用了摩纳哥的默认上下文菜单,之后编辑器上显示的上下文菜单是原生的。现在这就是您现在需要从本机代码自定义的内容
有没有办法让 Monaco 为上下文菜单使用系统菜单?
我在 macOS 上的 WKWebView
中嵌入了 Monaco。
上下文(右键单击)菜单呈现在 Web 视图中,而不是作为本机系统菜单。 (但是 VSCode 显示本机上下文菜单。)
我怎样才能使这个工作?
这就是我想要的:(我在 VS Code 中看到的)
但我得到了这个:(我在嵌入式 WKWebView 中得到的)
编辑 2:
你可以看到这实际上是一个系统菜单,它呈现在包含 window 之外的方式。截图:
所以在深入研究了所有这些之后。这个答案将指导您如何实现这一目标。如果您在任何浏览器中查看 MonaEditor 渲染的 ContextMenu
,它总是被视口裁剪。
这是因为上下文菜单是基于HTML的,受视口限制。
那么为什么 VSCode 能够在 ViewPort 之外显示菜单?
这是因为 electron 具有显示本机菜单的功能。 VSCode 禁用 Monaco 自己的菜单并在右键单击时创建本机菜单。你可以在下面看到 npm 模块,它显示了如何
https://github.com/mixmaxhq/electron-editor-context-menu
现在,当您使用 WKWebView 时,您不能使用电子功能,因此这意味着您需要在 Swift 代码中本地实现上下文处理程序。以下是一些 SO 线程,它们将为您指明正确的方向
我使用以下代码创建了一个 Cocoa 应用程序,以确保该方法有效
//
// ViewController.swift
// WebViewTEst
//
// Created by Tarun Lalwani on 4/8/18.
// Copyright © 2018 Tarun Lalwani. All rights reserved.
//
import Cocoa
import WebKit
class ViewController: NSViewController {
@IBOutlet weak var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let url = "https://microsoft.github.io/monaco-editor/"
let prefs = self.webView.configuration.preferences
prefs.javaScriptEnabled = true
prefs.plugInsEnabled = true
self.webView.customUserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5"
self.webView.configuration.preferences.setValue(true, forKey: "developerExtrasEnabled")
self.webView.load(URLRequest(url: URL(string: url)!))
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
}
然后通过 运行 editor.updateOptions({contextmenu: false})
禁用了摩纳哥的默认上下文菜单,之后编辑器上显示的上下文菜单是原生的。现在这就是您现在需要从本机代码自定义的内容