Visual studio code 摩纳哥编辑器:使用本机(系统)上下文菜单

Visual studio code 摩纳哥编辑器:使用本机(系统)上下文菜单,visual-studio-code,vscode-extensions,monaco-editor,visual-studio-monaco,Visual Studio Code,Vscode Extensions,Monaco Editor,Visual Studio Monaco,有没有办法让摩纳哥在上下文菜单中使用系统菜单 我已将Monaco嵌入macOS上的WKWebView。 上下文(右键单击)菜单在web视图中呈现,而不是作为本机系统菜单呈现。(但VSCode确实显示本机上下文菜单。) 我怎样才能做到这一点 这就是我想要的:(我在VS代码中看到的) 但我明白了:(我在嵌入式WKWebView中得到的) 编辑2: 从它在包含窗口外的渲染方式可以看出,这实际上是一个系统菜单。截图: 所以在深入研究了所有这些之后。这个答案将为你指明如何实现这一目标。如果您在任何

有没有办法让摩纳哥在上下文菜单中使用系统菜单

我已将Monaco嵌入macOS上的
WKWebView
。 上下文(右键单击)菜单在web视图中呈现,而不是作为本机系统菜单呈现。(但VSCode确实显示本机上下文菜单。)

我怎样才能做到这一点


这就是我想要的:(我在VS代码中看到的)

但我明白了:(我在嵌入式WKWebView中得到的)


编辑2: 从它在包含窗口外的渲染方式可以看出,这实际上是一个系统菜单。截图:


所以在深入研究了所有这些之后。这个答案将为你指明如何实现这一目标。如果您在任何浏览器中查看MonaEditor呈现的
ContextMenu
,它总是按视口剪裁

这是因为contextmenu是基于的HTML,它受视口的限制

那么为什么VSCode能够在视口外显示菜单呢

这是因为electron具有显示本机菜单的功能。VSCode禁用摩纳哥自己的菜单,并在右键单击时创建本机菜单。您可以看到下面的npm模块,它显示了如何

现在,当您使用WKWebView时,您不能使用electron功能,因此这意味着您需要在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})
禁用默认上下文菜单,然后编辑器上显示的上下文菜单是本机的。这就是您现在需要从本机代码自定义的内容


您所说的“系统上下文菜单”到底是什么意思?您的意思是要完全禁用上下文菜单(包括其中的选项),还是希望它以不同的方式“渲染”?可能一些屏幕截图(当前与所需)会有所帮助。对不起,我指的是当我右键单击文本时出现的菜单(“转到定义…”,“格式化文本”)等。在vs代码中,菜单显示为本机Mac菜单。在摩纳哥,我在web视图中得到一个“菜单”。是的。屏幕截图是个好主意。你忘了在问题中包括实际与期望的屏幕截图吗?看起来你喜欢这个主意是的。。是的。我已经贴上了。好吧——看起来很有希望。非常感谢。所以你基本上是说我必须为点击的内容创建自己的上下文菜单?是的。vscode是一个开源编辑器。我的赏金过期了,但我会再奖励一次。