Xamarin.Mac의 메뉴Menus in Xamarin.Mac

이 문서에서는 Xamarin.Mac 응용 프로그램에서 메뉴를 사용 하 여 작업을 설명 합니다. 만들고 유지 관리 메뉴 및 메뉴 항목 Xcode 및 Interface Builder에서 프로그래밍 방식으로 작업을 설명 합니다.This article covers working with menus in a Xamarin.Mac application. It describes creating and maintaining menus and menu items in Xcode and Interface Builder and working with them programmatically.

Xamarin.Mac 응용 프로그램에서 C# 및.NET을 사용 하 여 작업을 하는 경우 Objective C Xcode에서 작업 하는 개발자는 같은 Cocoa 메뉴에 액세스를 해야 합니다.When working with C# and .NET in a Xamarin.Mac application, you have access to the same Cocoa menus that a developer working in Objective-C and Xcode does. Xamarin.Mac이 Xcode와 직접 통합 되므로 만들기 및 프로그램 메뉴 모음, 메뉴 및 메뉴 항목을 유지 관리 (또는 필요에 따라 C# 코드에서 바로 작성) Xcode의 Interface Builder를 사용할 수 있습니다.Because Xamarin.Mac integrates directly with Xcode, you can use Xcode's Interface Builder to create and maintain your menu bars, menus, and menu items (or optionally create them directly in C# code).

메뉴는 Mac 응용 프로그램의 사용자 경험의 필수적인 부분 되며 일반적으로 사용자 인터페이스의 여러 부분에 나타납니다.Menus are an integral part of a Mac application's user experience and commonly appear in various parts of the user interface:

  • 응용 프로그램의 메뉴 모음 -모든 Mac 응용 프로그램에 대 한 화면 위쪽에 표시 되는 주 메뉴입니다.The application's menu bar - This is the main menu that appears at the top of the screen for every Mac application.
  • 상황에 맞는 메뉴 -이러한 사용자 마우스 오른쪽 단추로 클릭 하거나 컨트롤-클릭 창에서 항목을 표시 합니다.Contextual menus - These appear when the user right-clicks or control-clicks an item in a window.
  • 상태 표시줄 -(에서 메뉴 표시줄 시계의 왼쪽) 화면 위쪽에 표시 되는 항목에 추가 됨에 따라 왼쪽으로 증가 함에 따라 응용 프로그램 메뉴 모음의 오른쪽 끝에 있는 영역입니다.The status bar - This is the area at the far right side of the application menu bar that appears at the top of the screen (to the left of the menu bar clock) and grows to the left as items are added to it.
  • 도킹 메뉴 -도킹 스테이션에서 각 응용 프로그램에 대 한 메뉴 표시 되는 사용자가 아이콘을 마우스 단추를 누르고 경우 또는 사용자 마우스 오른쪽 단추로 클릭 하거나 응용 프로그램의 아이콘 컨트롤-클릭 합니다.Dock menu - The menu for each application in the dock that appears when the user right-clicks or control-clicks the application's icon, or when the user left-clicks the icon and holds the mouse button down.
  • 팝업 단추 및 목록을 풀 다운 -팝업 단추 선택된 된 항목을 표시 하 고 사용자가 클릭할 때 선택할 옵션 목록을 표시 합니다.Pop-up button and pull-down lists - A pop-up button displays a selected item and presents a list of options to select from when clicked by the user. 드롭다운 목록에는 일반적으로 현재 작업의 컨텍스트에 관련 특정 명령을 선택할 때 사용 되는 팝업 단추 형식입니다.A pull-down list is a type of pop-up button usually used for selecting commands specific to the context of the current task. 둘 다 창의 아무 곳 이나 나타날 수 있습니다.Both can appear anywhere in a window.

예제 메뉴An example menu

이 문서에서는 Cocoa 메뉴 모음, 메뉴 및 Xamarin.Mac 응용 프로그램에서 메뉴 항목을 사용 하는 기본 사항을 설명 합니다.In this article, we'll cover the basics of working with Cocoa menu bars, menus, and menu items in a Xamarin.Mac application. 것이 가장 좋습니다를 통해 작업 하는 합니다 Hello, Mac 먼저, 특히 문서 합니다 Xcode 및 Interface Builder 소개 하 고 출 선 및 작업 섹션으로 주요 개념 및이 문서를 사용 하는 기술을 설명 합니다.It is highly suggested that you work through the Hello, Mac article first, specifically the Introduction to Xcode and Interface Builder and Outlets and Actions sections, as it covers key concepts and techniques that we'll be using in this article.

확인 하려는 경우를 노출 C# 클래스 / objective-c 메서드 부분을 Xamarin.Mac 내부 요소 설명도 문서를 RegisterExport 특성 하 여 통신-C# 클래스 Objective-c 개체 및 UI 요소에 사용 합니다.You may want to take a look at the Exposing C# classes / methods to Objective-C section of the Xamarin.Mac Internals document as well, it explains the Register and Export attributes used to wire-up your C# classes to Objective-C objects and UI elements.

응용 프로그램의 메뉴 모음The application's menu bar

모든 창의 연결 된 메뉴 모음 자체를 가질 수 있는 Windows OS에서 실행 되는 응용 프로그램과 달리 macOS에서 실행 중인 모든 응용 프로그램에는 해당 응용 프로그램의 모든 창에 사용 되는 화면 상단의 실행 되는 단일 메뉴 모음에 있습니다.Unlike applications running on the Windows OS where every window can have its own menu bar attached to it, every application running on macOS has a single menu bar that runs along the top of the screen that's used for every window in that application:

메뉴 모음의A menu bar

이 메뉴 모음에서 항목 활성화 되거나 비활성화 된 특정된 시점에는 현재 컨텍스트 또는 응용 프로그램 및 해당 사용자 인터페이스의 상태에 따라 합니다.Items on this menu bar are activated or deactivated based on the current context or state of the application and its user interface at any given moment. 예를 들어: 사용자가 텍스트 필드를 선택 하는 경우 항목에 편집 메뉴와 같은 사용 가능한 상태가 됩니다 복사 하 고 잘라내기합니다.For example: if the user selects a text field, items on the Edit menu will be come enabled such as Copy and Cut.

Apple에 따라 및 기본적으로 모든 macOS 응용 프로그램에는 메뉴 및 응용 프로그램의 메뉴 모음에 나타나는 메뉴 항목의 표준 집합을 있습니다.According to Apple and by default, all macOS applications have a standard set of menus and menu items that appear in the application's menu bar:

  • Apple 메뉴 -이 메뉴 어떤 응용 프로그램이 실행 중인지에 관계 없이 항상 사용자에 게 제공 하는 와이드 항목 시스템에 대 한 액세스를 제공 합니다.Apple menu - This menu provides access to system wide items that are available to the user at all times, regardless of what application is running. 개발자가 이러한 항목을 수정할 수 없습니다.These items cannot be modified by the developer.
  • 앱 메뉴 -이 메뉴 굵게 표시 된 응용 프로그램의 이름을 표시 하 고는 사용자가 현재 실행 중인 응용 프로그램을 식별 하는 데 도움이 됩니다.App menu - This menu displays the application's name in bold and helps the user identify what application is currently running. 전체 및 없습니다 특정된 문서 또는 응용 프로그램을 종료 하는 등의 프로세스와 응용 프로그램에 적용 되는 항목을 포함 합니다.It contains items that apply to the application as a whole and not a given document or process such as quitting the application.
  • 파일 메뉴 -항목 만들기, 열기, 하는 데 사용 하거나 저장 문서를 사용 하 여 응용 프로그램이 작동 합니다.File menu - Items used to create, open, or save documents that your application works with. 응용 프로그램이 없는 경우 문서 기반,이 메뉴 이름을 바꾸거나 제거 합니다.If your application is not document-based, this menu can be renamed or removed.
  • 편집 메뉴 -같은 명령을 보유 잘라내기, 복사, 및 붙여넣기 편집 하거나 응용 프로그램의 사용자 인터페이스에서 요소를 수정 하는 데 사용 되는 합니다.Edit menu - Holds commands such as Cut, Copy, and Paste which are used to edit or modify elements in the application's user interface.
  • 서식 메뉴 -텍스트의 형식을 조정 하려면 저장 명령 텍스트를이 메뉴를 사용 하 여 응용 프로그램이 작동 하는 경우.Format menu - If the application works with text, this menu holds commands to adjust the formatting of that text.
  • 보기 메뉴 -명령에 영향을 주는 콘텐츠 표시 되는 방법을 응용 프로그램의 사용자 인터페이스에 (표시)를 보유 합니다.View menu - Holds commands that affect how content is displayed (viewed) in the application's user interface.
  • 응용 프로그램별 메뉴 -(예: 웹 브라우저에 대 한 책갈피 메뉴) 응용 프로그램에 관련 된 모든 메뉴는 합니다.Application-specific menus - These are any menus that are specific to your application (such as a bookmarks menu for a web browser). 간에 표시 되어야 합니다 보기 하 고 메뉴 모음에서.They should appear between the View and Window menus on the bar.
  • 창 메뉴 -windows 응용 프로그램 뿐만 아니라 현재 열린 창의 목록에서 사용 하기 위한 명령이 포함 되어 있습니다.Window menu - Contains commands for working with windows in your application, as well as a list of current open windows.
  • 도움말 메뉴 -도움말 메뉴 맨 오른쪽 메뉴 모음에서 해야 응용 프로그램에서 온라인 도움말을 제공 합니다.Help menu - If your application provides onscreen help, the Help menu should be the right-most menu on the bar.

응용 프로그램 메뉴 및 표준 메뉴 및 메뉴 항목에 대 한 자세한 내용은 Apple의를 참조 하세요 Human Interface Guidelines합니다.For more information about the application menu bar and standard menus and menu items, please see Apple's Human Interface Guidelines.

기본 응용 프로그램 메뉴 모음The default application menu bar

새 Xamarin.Mac 프로젝트를 만들 때마다 자동으로 macOS 응용 프로그램을 정상적으로 (위의 섹션에 설명)으로 포함 하는 일반적인 항목에 있는 표준 기본 응용 프로그램 메뉴 모음을 가져옵니다.Whenever you create a new Xamarin.Mac project, you automatically get a standard, default application menu bar that has the typical items that a macOS application would normally have (as discussed in the section above). 에 정의 되어 있는 응용 프로그램의 기본 메뉴 표시줄의 Main.storyboard 파일 (앱 UI의 나머지 부분)의 프로젝트 아래에 Solution Pad:Your application's default menu bar is defined in the Main.storyboard file (along with the rest of your app's UI) under the project in the Solution Pad:

주 스토리 보드 선택Select the main storyboard

두 번 클릭 합니다 Main.storyboard 메뉴 편집기 인터페이스를 사용 하 여 표시 됩니다 Xcode의 Interface Builder에서 편집에 대 한 열려는 파일:Double-click the Main.storyboard file to open it for editing in Xcode's Interface Builder and you'll be presented with the menu editor interface:

UI Xcode에서 편집Editing the UI in Xcode

여기에서 수 클릭 항목 같은 열기 의 메뉴 항목은 파일 메뉴를 편집 하거나에서 속성을 조정 합니다 특성 검사기:From here we can click on items such as the Open menu item in the File menu and edit or adjust its properties in the Attributes Inspector:

메뉴의 특성을 편집Editing a menu's attributes

추가, 편집 및 메뉴 및이 문서의 뒷부분에 나오는 항목 삭제 하겠습니다.We'll get into adding, editing, and deleting menus and items later in this article. 이제 방금 확인 하려는 기본적으로 사용할 수 있는 메뉴 및 메뉴 항목 및 방법을 자동으로 표시 되지 미리 정의 된 출 선 및 작업 집합을 통해 코드에 대 한 (자세한 내용은 참조 하세요. 당사의 출 선 및 작업 설명서)입니다.For now we just want to see what menus and menu items are available by default and how they have been automatically exposed to code via a set of predefined outlets and actions (for more information see our Outlets and Actions documentation).

예를 들어 여기를 클릭 합니다 연결 검사기 에 대 한를 열기 가 자동으로 연결 되는 최대 보면 메뉴 항목을 openDocument: 작업:For example, if we click on the Connection Inspector for the Open menu item we can see it is automatically wired up to the openDocument: action:

연결 된 작업 보기Viewing the attached action

선택 하는 경우는 첫 번째 응답자인터페이스 계층 구조 에서 아래로 스크롤하여는 연결 검사기의 정의 볼 수 있습니다는 openDocument: 작업 하는 열려 (함께 여러 가지 다른 기본 작업 응용 프로그램에 대 한 하는 자동으로 연결 되어 있지 않음 컨트롤까지) 메뉴 항목에 연결 된:If you select the First Responder in the Interface Hierarchy and scroll down in the Connection Inspector, and you will see the definition of the openDocument: action that the Open menu item is attached to (along with several other default actions for the application that are and are not automatically wired up to controls):

연결 된 모든 작업 보기Viewing all attached actions

이 중요 한 이유는?Why is this important? 다음에서 섹션에서는 이러한 자동으로 정의 된 작업 방식으로 자동으로 사용 하도록 설정 하 고 메뉴 항목을 사용 하지 않도록 설정으로, 항목에 대 한 기본 제공 기능을 제공 다른 Cocoa 사용자 인터페이스 요소를 사용 하 여 표시 됩니다.In the next section will see how these automatically-defined actions work with other Cocoa user interface elements to automatically enable and disable menu items, as well as, provide built-in functionality for the items.

나중에 사용할 예정 이러한 기본 제공 작업을 사용 하도록 설정 하 고 코드에서 항목을 사용 하지 않도록 선택 하면 고유한 기능을 제공 합니다.Later we'll be using these built-in actions to enable and disable items from code and provide our own functionality when they are selected.

기본 제공 메뉴 기능Built-in menu functionality

일부 항목이 자동으로 했으니를 활성화 (완벽 하 게 기능으로 자동으로 기본 제공)와 같은 보면 UI 항목 또는 코드를 추가 하기 전에 새로 만든된 Xamarin.Mac 응용 프로그램을 실행 하는 경우에 Quit 항목에 메뉴:If you were the run a newly created Xamarin.Mac application before adding any UI items or code, you'll notice that some items are automatically wired-up and enabled for you (with fully functionality automatically built-in), such as the Quit item in the App menu:

활성화 메뉴 항목An enabled menu item

다른 메뉴 항목과 같은 while 잘라내기, 복사본, 및 붙여넣기 없습니다:While other menu items, such as Cut, Copy, and Paste are not:

메뉴 항목을 사용 하지 않도록 설정Disabled menu items

보겠습니다 응용 프로그램을 중지 하 고 두 번 클릭 합니다 Main.storyboard 파일는 Solution Pad 의 Interface Builder를 Xcode에서 편집을 위해 엽니다.Let's stop the application and double-click the Main.storyboard file in the Solution Pad to open it for editing in Xcode's Interface Builder. 를 끌어를 텍스트 뷰 에서 합니다 라이브러리 에서 창의 뷰 컨트롤러에는 인터페이스 편집기:Next, drag a Text View from the Library onto the window's view controller in the Interface Editor:

라이브러리에서 텍스트 뷰를 선택 하Selecting a Text View from the Library

제약 조건 편집기 보겠습니다 텍스트 뷰 창의 가장자리를 고정 하 고 증가 하 고 모든 4 개의 빨간색 I-빔 편집기의 맨 위에 있는 클릭 하 여 창을 사용 하 여 축소 설정 된 4 개 제약 조건추가 단추:In the Constraint Editor let's pin the text view to the window's edges and set it where it grows and shrinks with the window by clicking all four red I-beams at the top of the editor and clicking the Add 4 Constraints button:

편집 제약Editing the contraints

사용자 인터페이스 디자인에 변경 내용을 저장 하 고 Xamarin.Mac 프로젝트를 사용 하 여 변경 내용을 동기화 하는 Mac 용 Visual Studio를 다시 전환 합니다.Save your changes to the user interface design and switch back the Visual Studio for Mac to synchronize the changes with your Xamarin.Mac project. 이제 응용 프로그램을 시작, 텍스트 보기에 일부 텍스트를 입력, 선택 및 엽니다는 편집 메뉴:Now start the application, type some text into the text view, select it, and open the Edit menu:

메뉴 항목은 자동으로 사용/사용 안 함The menu items are automatically enabled/disabled

알림 방법을 잘라내기복사, 및 붙여넣기 항목이 자동으로 사용 하도록 설정 되어 코드를 전혀 작성 하지 않고도 완전 한 기능을 합니다.Notice how the Cut, Copy, and Paste items are automatically enabled and fully functional, all without writing a single line of code.

여기에 무슨 일이 일어나고 있나요?What's going on here? 기본 제공 (위에서 제공) 처럼 유선 최대 기본 메뉴 항목 제공 되는 작업을 미리 정의할를 후크 특정 작업을 기본적으로 대부분의 macos에 포함 된 Cocoa 사용자 인터페이스 요소 (같은 copy:).Remember the built-in predefine actions that come wired up to the default menu items (as presented above), most of the Cocoa user interface elements that are part of macOS have built in hooks to specific actions (such as copy:). 따라서 활성 창에 추가 하 고 선택 하면 해당 메뉴 항목 또는 항목에 연결할 때 해당 작업은 자동으로 사용 합니다.So when they are added to a window, active, and selected, the corresponding menu item or items attached to that action are automatically enabled. 사용자가 해당 메뉴 항목을 선택 하는 경우에 UI 요소에 기본 제공 기능 호출 및 개발자의 개입 없이 실행 합니다.If the user selects that menu item, the functionality built into the UI element is called and executed, all without developer intervention.

설정 및 해제 메뉴 및 항목Enabling and disabling menus and items

기본적으로 사용자 이벤트가 발생할 때마다 NSMenu 자동으로 사용 하도록 설정 하 고 각 표시 메뉴 및 메뉴 항목 컨텍스트를 기반으로 응용 프로그램의 사용 하지 않도록 설정 합니다.By default, every time a user event occurs, NSMenu automatically enables and disables each visible menu and menu item based on the context of the application. 항목에 대 한 활성화/비활성화 하는 방법은 세 가지가 있습니다.There are three ways to enable/disable an item:

  • 자동 메뉴를 사용 하도록 설정 -경우에 메뉴 항목을 사용할 수는 NSMenu 항목은 유선에 접속 하는 작업에 반응 하는 적절 한 개체를 찾을 수 있습니다.Automatic menu enabling - A menu item is enabled if NSMenu can find an appropriate object that responds to the action that the item is wired-up to. 예를 들어 텍스트 보기 위의 기본 제공 후크를 갖고 있던는 copy: 동작 합니다.For example, the text view above that had a built-in hook to the copy: action.
  • 사용자 지정 작업 및 validateMenuItem: -바인딩되는 메뉴 항목에 대 한는 창 또는 보기 컨트롤러 사용자 지정 작업를 추가할 수 있습니다는 validateMenuItem: 작업을 수동으로 활성화 또는 비활성화 메뉴 항목입니다.Custom actions and validateMenuItem: - For any menu item that is bound to a window or view controller custom action, you can add the validateMenuItem: action and manually enable or disable menu items.
  • 수동 메뉴를 사용 하도록 설정 -수동으로 설정 합니다 Enabled 의 각 속성 NSMenuItem 사용 하도록 설정 하거나 메뉴의 각 항목이 개별적으로 사용 하지 않도록 설정 합니다.Manual menu enabling - You manually set the Enabled property of each NSMenuItem to enable or disable each item in a menu individually.

시스템을 선택 하려면 설정 합니다 AutoEnablesItems 의 속성을 NSMenu입니다.To choose a system, set the AutoEnablesItems property of a NSMenu. true 자동 (기본 동작) 및 false 수동입니다.true is automatic (the default behavior) and false is manual.

중요

사용 하 여 수동 메뉴를 사용 하도록 설정 하려는 경우 없음 메뉴의 항목에 같은 AppKit 클래스에 의해 제어 되는 NSTextView를 자동으로 업데이트 됩니다.If you choose to use manual menu enabling, none of the menu items, even those controlled by AppKit classes like NSTextView, are updated automatically. 사용 하도록 설정 하 고 코드에서 직접 모든 항목을 사용 하지 않도록 설정 됩니다.You will be responsible for enabling and disabling all items by hand in code.

ValidateMenuItem를 사용 하 여Using validateMenuItem

가 바인딩되는 모든 메뉴 항목에 대해 설명한 것 처럼를 창 또는 보기 컨트롤러 사용자 지정 작업를 추가할 수 있습니다를 validateMenuItem: 작업을 수동으로 활성화 또는 비활성화 메뉴 항목입니다.As stated above, for any menu item that is bound to a Window or View Controller Custom Action, you can add the validateMenuItem: action and manually enable or disable menu items.

다음 예제에서는 Tag 속성은 수 활성화/비활성화 하 여는 메뉴 항목의 형식을 결정 하는 validateMenuItem: 에서 선택한 텍스트의 상태를 기반으로 작업을 NSTextView.In the following example, the Tag property will be used to decide the type of menu item that will be enabled/disabled by the validateMenuItem: action based on the state of selected text in a NSTextView. Tag Interface Builder에서 각 메뉴 항목 속성 설정 되었습니다.The Tag property has been set in Interface Builder for each menu item:

태그 속성을 설정Setting the Tag property

및 다음 코드는 보기 컨트롤러에 추가:And the following code added to the View Controller:

[Action("validateMenuItem:")]
public bool ValidateMenuItem (NSMenuItem item) {

    // Take action based on the menu item type
    // (As specified in its Tag)
    switch (item.Tag) {
    case 1:
        // Wrap menu items should only be available if
        // a range of text is selected
        return (TextEditor.SelectedRange.Length > 0);
    case 2:
        // Quote menu items should only be available if
        // a range is NOT selected.
        return (TextEditor.SelectedRange.Length == 0);
    }

    return true;
}

이 코드를 실행 및에서 선택한 텍스트가 없는 경우는 NSTextView, 두 줄 바꿈 메뉴 항목은도 사용할 수 없습니다 (해당은 뷰 컨트롤러의 작업에 연결):When this code is run, and no text is selected in the NSTextView, the two wrap menu items are disabled (even though they are wired to actions on the view controller):

사용 하지 않도록 설정 하는 표시 항목Showing disabled items

텍스트 섹션을 선택 하 고 메뉴를 다시 열 경우에 두 개의 줄 바꿈 메뉴 항목을 사용할 수 있습니다.If a section of text is selected and the menu reopened, the two wrap menu items will be available:

사용 하도록 설정 하는 표시 항목Showing enabled items

사용 하도록 설정 하 고 코드에서 메뉴 항목에 응답Enabling and responding to menu items in code

(예: 텍스트 필드의 경우)는 UI 디자인에 특정 Cocoa 사용자 인터페이스 요소를 추가 하 여 위에서 살펴본 대로 사용할 기본 메뉴 항목의 여러 및 코드를 작성할 필요 없이 자동으로 작동 합니다.As we have seen above, just by adding specific Cocoa user interface elements to our UI design (such as a text field), several of the default menu items will be enabled and function automatically, without having to write any code. 다음 메뉴 항목을 선택할 때 기능을 제공할 Xamarin.Mac 프로젝트에 고유한 C# 코드를 추가에 대해 살펴보겠습니다.Next let's look at adding our own C# code to our Xamarin.Mac project to enable a menu item and provide functionality when the user selects it.

사용자가 사용할 수 있게 하고자 하는 예를 들어, let 말입니다.는 엽니다 항목에 파일 메뉴 폴더를 선택 합니다.For example, let say we want the user to be able to use the Open item in the File menu to select a folder. 응용 프로그램 수준의 함수가 고 제공 창 또는 UI 요소에 제한 되지 때문이 응용 프로그램 대리자에 게이 처리 하는 코드를 추가 하겠습니다.Since we want this to be an application-wide function and not limited to a give window or UI element, we're going to add the code to handle this to our application delegate.

Solution Pad, 두 번 클릭 합니다 AppDelegate.CS 파일을 편집 하는 것에 대 한 열:In the Solution Pad, double-click the AppDelegate.CS file to open it for editing:

앱 대리자를 선택 하면Selecting the app delegate

아래 다음 코드를 추가 합니다 DidFinishLaunching 메서드:Add the following code below the DidFinishLaunching method:

[Export ("openDocument:")]
void OpenDialog (NSObject sender)
{
    var dlg = NSOpenPanel.OpenPanel;
    dlg.CanChooseFiles = false;
    dlg.CanChooseDirectories = true;

    if (dlg.RunModal () == 1) {
        var alert = new NSAlert () {
            AlertStyle = NSAlertStyle.Informational,
            InformativeText = "At this point we should do something with the folder that the user just selected in the Open File Dialog box...",
            MessageText = "Folder Selected"
        };
        alert.RunModal ();
    }
}

보겠습니다 이제 응용 프로그램을 실행 하 고 엽니다는 파일 메뉴:Let's run the application now and open the File menu:

파일 메뉴The File menu

열려 메뉴 항목은 이제 사용 하도록 설정 합니다.Notice that the Open menu item is now enabled. 를 선택 하는 경우 열기 대화 상자가 표시 됩니다.If we select it, the open dialog will be displayed:

대화 상자를 엽니다An open dialog

클릭 하면를 열려 단추를이 경고 메시지가 표시 됩니다.If we click the Open button, our alert message will be displayed:

예제 대화 메시지An example dialog message

키 줄 여기 되었습니다 [Export ("openDocument:")], 알려줍니다 NSMenu 는 우리의 AppDelegate 메서드가 void OpenDialog (NSObject sender) 응답 하는 openDocument: 작업.The key line here was [Export ("openDocument:")], it tells NSMenu that our AppDelegate has a method void OpenDialog (NSObject sender) that responds to the openDocument: action. 위의 기억할 수 하는 경우는 열고 메뉴 항목은 자동으로 했으니가이 동작에 Interface Builder에서 기본적으로:If you'll remember from above, the Open menu item is automatically wired-up to this action by default in Interface Builder:

연결 된 작업을 보는Viewing the attached actions

다음에 대해 살펴보겠습니다 고유한 메뉴, 메뉴 항목 및 작업 만들기 및 응답에 코드에서 해당 합니다.Next let's look at creating our own menu, menu items, and actions and responding to them in code.

최근 열기 메뉴 사용Working with the open recent menu

기본적으로 파일 메뉴에는 열린 최근 추적 하는 사용자가 앱을 사용 하 여 열려 있는 마지막 몇 가지 파일 항목입니다.By default, the File menu contains an Open Recent item that keeps track of the last several files that the user has opened with your app. 만들려는 경우를 NSDocument 기반 Xamarin.Mac 앱이이 메뉴를에 자동으로 처리 합니다.If you are creating a NSDocument based Xamarin.Mac app, this menu will be handled for you automatically. Xamarin.Mac 앱의 다른 모든 형식에 대 한 관리 및이 메뉴 항목을 수동으로 대응 하는 일을 담당 해야 합니다.For any other type of Xamarin.Mac app, you will be responsible for managing and responding to this menu item manually.

직접 처리 합니다 열린 최근 메뉴, 먼저 새 파일을 열거나 다음을 사용 하 여 저장 된에 알리기 위해:To manually handle the Open Recent menu, you will first need to inform it that a new file has been opened or saved using the following:

// Add document to the Open Recent menu
NSDocumentController.SharedDocumentController.NoteNewRecentDocumentURL(url);

앱을 사용 하지 않는 경우에 NSDocuments를 계속 사용할를 NSDocumentController 유지 하기 위해를 열린 최근 전송 하 여 메뉴를 NSUrl 파일의 위치를 사용 하 여를 NoteNewRecentDocumentURL 메서드의 SharedDocumentController합니다.Even though your app is not using NSDocuments, you still use the NSDocumentController to maintain the Open Recent menu by sending a NSUrl with the location of the file to the NoteNewRecentDocumentURL method of the SharedDocumentController.

재정의 해야 하는 다음에 OpenFile 에서 사용자가 선택한 모든 파일을 열고 앱 대리자의 메서드를 최근 메뉴.Next, you need to override the OpenFile method of the app delegate to open any file that the user selects from the Open Recent menu. 예를 들어:For example:

public override bool OpenFile (NSApplication sender, string filename)
{
    // Trap all errors
    try {
        filename = filename.Replace (" ", "%20");
        var url = new NSUrl ("file://"+filename);
        return OpenFile(url);
    } catch {
        return false;
    }
}

반환 true 파일을 열 수 있는 경우 다른 반환 false 기본 제공 경고는 파일을 열 수 없습니다 사용자에 게 표시 됩니다.Return true if the file can be opened, else return false and a built-in warning will be displayed to the user that the file could not be opened.

파일 이름 및 경로 반환 하기 때문에 열린 최근 메뉴에는 공백이 포함 될 수 있습니다, 올바르게를 만들기 전에이 문자를 이스케이프 해야는 NSUrl 오류가 발생 하면 또는 합니다.Because the filename and path returned from the Open Recent menu, might include a space, we need to properly escape this character before creating a NSUrl or we will get an error. 에서는 다음 코드를 사용 하 여 그렇게 합니다.We do that with the following code:

filename = filename.Replace (" ", "%20");

마지막으로 만들 것을 NSUrl 파일 및 앱에서 도우미 메서드를 새 창을 열고 파일 로드 대리자 사용을 가리키는:Finally, we create a NSUrl that points to the file and use a helper method in the app delegate to open a new window and load the file into it:

var url = new NSUrl ("file://"+filename);
return OpenFile(url);

모든 항목이 함께 끌어올 살펴보겠습니다는의 구현 예제는 AppDelegate.cs 파일:To pull everything together, let's take a look at an example implementation in an AppDelegate.cs file:

using AppKit;
using Foundation;
using System.IO;
using System;

namespace MacHyperlink
{
    [Register ("AppDelegate")]
    public class AppDelegate : NSApplicationDelegate
    {
        #region Computed Properties
        public int NewWindowNumber { get; set;} = -1;
        #endregion

        #region Constructors
        public AppDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override void DidFinishLaunching (NSNotification notification)
        {
            // Insert code here to initialize your application
        }

        public override void WillTerminate (NSNotification notification)
        {
            // Insert code here to tear down your application
        }

        public override bool OpenFile (NSApplication sender, string filename)
        {
            // Trap all errors
            try {
                filename = filename.Replace (" ", "%20");
                var url = new NSUrl ("file://"+filename);
                return OpenFile(url);
            } catch {
                return false;
            }
        }
        #endregion

        #region Private Methods
        private bool OpenFile(NSUrl url) {
            var good = false;

            // Trap all errors
            try {
                var path = url.Path;

                // Is the file already open?
                for(int n=0; n<NSApplication.SharedApplication.Windows.Length; ++n) {
                    var content = NSApplication.SharedApplication.Windows[n].ContentViewController as ViewController;
                    if (content != null && path == content.FilePath) {
                        // Bring window to front
                        NSApplication.SharedApplication.Windows[n].MakeKeyAndOrderFront(this);
                        return true;
                    }
                }

                // Get new window
                var storyboard = NSStoryboard.FromName ("Main", null);
                var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController;

                // Display
                controller.ShowWindow(this);

                // Load the text into the window
                var viewController = controller.Window.ContentViewController as ViewController;
                viewController.Text = File.ReadAllText(path);
                viewController.SetLanguageFromPath(path);
                viewController.View.Window.SetTitleWithRepresentedFilename (Path.GetFileName(path));
                viewController.View.Window.RepresentedUrl = url;

                // Add document to the Open Recent menu
                NSDocumentController.SharedDocumentController.NoteNewRecentDocumentURL(url);

                // Make as successful
                good = true;
            } catch {
                // Mark as bad file on error
                good = false;
            }

            // Return results
            return good;
        }
        #endregion

        #region actions
        [Export ("openDocument:")]
        void OpenDialog (NSObject sender)
        {
            var dlg = NSOpenPanel.OpenPanel;
            dlg.CanChooseFiles = true;
            dlg.CanChooseDirectories = false;

            if (dlg.RunModal () == 1) {
                // Nab the first file
                var url = dlg.Urls [0];

                if (url != null) {
                    // Open the document in a new window
                    OpenFile (url);
                }
            }
        }
        #endregion
    }
}

앱의 요구 사항에 따라 하지 않을 사용자가 동시에 둘 이상의 창에서 동일한 파일을 엽니다.Based on the requirements of your app, you might not want the user to open the same file in more than one window at the same time. 예제 앱에서 사용자가 이미 열려 있는 파일을 선택 하는 경우 (에서 합니다 최근 또는 열기...In our example app, if the user chooses a file that is already open (either from the Open Recent or Open.. 메뉴 항목의 경우) 파일이 포함 된 창 앞으로 상태로 전환 됩니다.menu items), the window that contains the file is brought to the front.

이를 위해이 도우미 메서드에 다음 코드를 사용 했습니다.To accomplish this, we used the following code in our helper method:

var path = url.Path;

// Is the file already open?
for(int n=0; n<NSApplication.SharedApplication.Windows.Length; ++n) {
    var content = NSApplication.SharedApplication.Windows[n].ContentViewController as ViewController;
    if (content != null && path == content.FilePath) {
        // Bring window to front
        NSApplication.SharedApplication.Windows[n].MakeKeyAndOrderFront(this);
        return true;
    }
}

설계 했습니다 우리의 ViewController 경로에서 파일에 포함 된 클래스를 해당 Path 속성입니다.We designed our ViewController class to hold the path to the file in its Path property. 그런 다음 앱에서 현재 열려 있는 모든 창을 통해 루프입니다.Next, we loop through all currently open windows in the app. 이면 파일이 이미 열려 창 중 하나에서 사용 하 여 다른 모든 windows의 맨 앞으로 가져오기:If the file is already open in one of the windows, it is brought to the front of all other windows using:

NSApplication.SharedApplication.Windows[n].MakeKeyAndOrderFront(this);

일치 항목이 없으면, 새 창을 로드 된 파일을 사용 하 여 연 파일에 설명 되어는 열린 최근 메뉴:If no match is found, a new window is opened with the file loaded and the file is noted in the Open Recent menu:

// Get new window
var storyboard = NSStoryboard.FromName ("Main", null);
var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController;

// Display
controller.ShowWindow(this);

// Load the text into the window
var viewController = controller.Window.ContentViewController as ViewController;
viewController.Text = File.ReadAllText(path);
viewController.SetLanguageFromPath(path);
viewController.View.Window.SetTitleWithRepresentedFilename (Path.GetFileName(path));
viewController.View.Window.RepresentedUrl = url;

// Add document to the Open Recent menu
NSDocumentController.SharedDocumentController.NoteNewRecentDocumentURL(url);

사용자 지정 창 작업 사용Working with custom window actions

마찬가지로 다음 기본 제공 첫 번째 응답자 미리 유선 표준 메뉴 항목에 제공 되는 작업을 만들어 새 사용자 지정 작업 하는 Interface Builder에서 메뉴 항목에 연결 하 합니다.Just like the built-in First Responder actions that come pre-wired to standard menu items, you can create new, custom actions and wire them to menu items in Interface Builder.

먼저, 응용 프로그램의 창 컨트롤러 중 하나에서 사용자 지정 작업을 정의 합니다.First, define a custom action on one of your app's window controllers. 예를 들어:For example:

[Action("defineKeyword:")]
public void defineKeyword (NSObject sender) {
    // Preform some action when the menu is selected
    Console.WriteLine ("Request to define keyword");
}

다음으로 앱의 스토리 보드 파일을 두 번 클릭 합니다 Solution Pad 의 Interface Builder를 Xcode에서 편집을 위해 엽니다.Next, double-click the app's storyboard file in the Solution Pad to open it for editing in Xcode's Interface Builder. 선택 합니다 첫 번째 응답자 아래를 응용 프로그램 장면, 전환를 특성 검사기:Select the First Responder under the Application Scene, then switch to the Attributes Inspector:

특성 검사기The Attributes Inspector

클릭 합니다 + 아래쪽의 단추를 특성 검사기 새 사용자 지정 동작을 추가 하려면:Click the + button at the bottom of the Attributes Inspector to add a new custom action:

새 작업 추가Adding a new action

창 컨트롤러에서 만든 사용자 지정 작업으로 동일한 이름을 지정 합니다.Give it the same name as the custom action that you created on your window controller:

작업 이름을 편집Editing the action name

메뉴 항목을 끌어서 컨트롤-클릭 합니다 첫 번째 응답자 아래에서 응용 프로그램 장면합니다.Control-click and drag from a menu item to the First Responder under the Application Scene. 팝업 목록에서 방금 만든 새 작업을 선택 합니다 (defineKeyword: 이 예제의):From the popup list, select the new action you just created (defineKeyword: in this example):

액션을 연결Attaching an action

스토리 보드에 변경 내용을 저장 하 고 변경 내용을 동기화 하는 Mac 용 Visual Studio로 돌아갑니다.Save the changes to the storyboard and return to Visual Studio for Mac to sync the changes. 앱을 실행 하는 경우 사용자 지정 동작을 연결 하는 메뉴 항목은 자동으로 수 사용/사용 안 함 (열린 상태에서 작업을 사용 하 여 창에 기반한) 로깅하고 메뉴 항목을 선택 하는 작업:If you run the app, the menu item that you connected the custom action to will automatically be enabled/disabled (based on the window with the action being open) and selecting the menu item will fire off the action:

새 동작을 테스트Testing the new action

추가, 편집 및 삭제 메뉴Adding, editing, and deleting menus

이전 섹션에서 살펴본 대로 Xamarin.Mac 응용 프로그램을 미리 설정 된 수의 기본 메뉴와 특정 UI 컨트롤은 자동으로 활성화 하 고 응답할 수 있는 메뉴 항목 제공 됩니다.As we have seen in the previous sections, a Xamarin.Mac application comes with a preset number of default menus and menu items that specific UI controls will automatically activate and respond to. 또한 사용 하도록 설정 하 고 이러한 기본 항목에 응답 하는 응용 프로그램 코드를 추가 하는 방법 또한 살펴보았습니다.We have also seen how to add code to our application that will also enable and respond to these default items.

이 섹션에서 살펴보겠습니다 필요 하지 않은 메뉴 항목을 제거 하 고 메뉴를 다시 구성 하면 새 메뉴, 메뉴 항목 및 작업을 추가 합니다.In this section we will look at removing menu items that we don't need, reorganizing menus and adding new menus, menu items and actions.

두 번 클릭 합니다 Main.storyboard 파일는 Solution Pad 열어 편집 하려면:Double-click the Main.storyboard file in the Solution Pad to open it for editing:

UI Xcode에서 편집Editing the UI in Xcode

특정 Xamarin.Mac 응용 프로그램에 대 한 것 하지 않는 기본값 사용 보기 메뉴를 제거 하겠습니다.For our specific Xamarin.Mac application we are not going to be using the default View menu so we are going to remove it. 인터페이스 계층 구조 선택 합니다 보기 주 메뉴 표시줄의 포함 된 메뉴 항목:In the Interface Hierarchy select the View menu item that is a part of the main menu bar:

보기 메뉴 항목 선택Selecting the View menu item

삭제를 누르거나 메뉴를 삭제 하려면 백스페이스 합니다.Press delete or backspace to delete the menu. 다음으로, 않겠습니다에서 항목을 모두 사용 합니다 형식 메뉴 아웃 하위 메뉴에서 사용 하려는 항목을 이동 하려고 합니다.Next, we aren't going to be using all of the items in the Format menu and we want to move the items we are going to use out from under the sub menus. 인터페이스 계층 구조 다음 메뉴 항목을 선택 합니다.In the Interface Hierarchy select the following menu items:

여러 항목을 강조 표시Highlighting multiple items

부모 아래에 있는 항목을 끌어 메뉴 현재 되 고 하위 메뉴에서:Drag the items under the parent Menu from the sub-menu where they currently are:

부모 메뉴에 메뉴 항목을 끌어Dragging menu items to the parent menu

이제 메뉴가 같습니다.Your menu should now look like:

새 위치에 있는 항목The items in the new location

다음 끌어 보겠습니다 합니다 텍스트 아웃 하위 메뉴 아래에서 형식 메뉴 사이의 주 메뉴 모음에 배치 하는 형식 메뉴:Next let's drag the Text sub-menu out from under the Format menu and place it on the main menu bar between the Format and Window menus:

텍스트 메뉴The Text menu

다시 돌아가 보겠습니다 합니다 형식 메뉴와 삭제는 글꼴 하위 메뉴 항목입니다.Let's go back under the Format menu and delete the Font sub-menu item. 다음으로, 선택는 형식 메뉴 "글꼴"로 이름을 바꿉니다.Next, select the Format menu and rename it "Font":

글꼴 메뉴The Font menu

다음으로 자동으로 가져올 텍스트에 추가 텍스트 뷰에서 선택 하면 미리 정의 된 구의 사용자 지정 메뉴를 만들어 보겠습니다.Next, let's create a custom menu of predefine phrases that will automatically get appended to the text in the text view when they are selected. 맨 위에 있는 검색 상자에는 라이브러리 검사기 유형 "메뉴"로 지정 합니다.In the search box at the bottom on the Library Inspector type in "menu." 이 쉽게 찾아서 모든 메뉴 UI 요소를 사용 하 여 작업:This will make it easier to find and work with all of the menu UI elements:

라이브러리 검사기The Library Inspector

이제이 메뉴를 만들려면 다음을 수행 하겠습니다.Now let's do the following to create our menu:

  1. 끌어서를 메뉴 항목 에서 라이브러리 검사기 간에 메뉴 모음에는 텍스트 하 고 메뉴:Drag a Menu Item from the Library Inspector onto the menu bar between the Text and Window menus:

    라이브러리에 새 메뉴 항목을 선택 하면Selecting a new menu item in the Library

  2. "구" 항목의 이름을 바꾸려면Rename the item "Phrases":

    메뉴 이름 설정Setting the menu name

  3. 다음 끌어를 메뉴 에서 합니다 라이브러리 검사기:Next drag a Menu from the Library Inspector:

    라이브러리에서 메뉴를 선택 하면Selecting a menu from the Library

  4. 다음 drop 메뉴메뉴 항목 방금 생성 하 고 해당 이름을 "구"로 변경 합니다.Drop then Menu on the new Menu Item we just created and change its name to "Phrases":

    편집 메뉴 이름을Editing the menu name

  5. 이제 세 가지 기본 이름을 메뉴 항목 "Address", "날짜" 및 "Greeting":Now let's rename the three default Menu Items "Address", "Date," and "Greeting":

    구 메뉴The Phrases menu

  6. 네 번째를 추가 해 보겠습니다 메뉴 항목 끌어를 메뉴 항목 에서 합니다 라이브러리 검사기 "서명"을 호출 하 고:Let's add a fourth Menu Item by dragging a Menu Item from the Library Inspector and calling it "Signature":

    메뉴 항목 이름을 편집Editing the menu item name

  7. 메뉴 모음에 저장 합니다.Save the changes to the menu bar.

이제 C# 코드에 노출 되는 새 메뉴 항목을 사용자 지정 동작의 집합을 만들어 보겠습니다.Now let's create a set of custom actions so that our new menu items are exposed to C# code. Xcode에서으로 전환 해 보겠습니다 합니다 Assistant 보기:In Xcode let's switch to the Assistant view:

필요한 작업을 만드는Creating the required actions

다음을 수행 하겠습니다.Let's do the following:

  1. 컨트롤 끌기 합니다 주소 메뉴 항목에는 AppDelegate.h 파일입니다.Control-drag from the Address menu item to the AppDelegate.h file.

  2. 스위치를 연결 형식을 동작:Switch the Connection type to Action:

    작업 유형 선택Selecting the action type

  3. 입력을 이름 누릅니다 "phraseAddress"는 Connect 새 작업을 만드는 단추:Enter a Name of "phraseAddress" and press the Connect button to create the new action:

    동작 구성Configuring the action

  4. 에 대해 위의 단계를 반복 합니다 날짜인사말, 및 서명을 메뉴 항목:Repeat the above steps for the Date, Greeting, and Signature menu items:

    완료 된 작업The completed actions

  5. 메뉴 모음에 저장 합니다.Save the changes to the menu bar.

다음에서는 코드에서 해당 콘텐츠를 조정할 수 있도록 텍스트 보기에 대 한 콘센트를 만들어야 합니다.Next we need to create an outlet for our text view so that we can adjust its content from code. 선택 합니다 ViewController.h 파일을 도우미 편집기 를 호출 하는 새 콘센트를 만들어 documentText:Select the ViewController.h file in the Assistant Editor and create a new outlet called documentText:

만드는 출 선Creating an outlet

Xcode에서 변경 내용을 동기화 하는 Mac 용 Visual Studio로 돌아갑니다.Return to Visual Studio for Mac to sync the changes from Xcode. 다음 편집 합니다 ViewController.cs 파일을 다음과 같이 표시 되도록 합니다.Next edit the ViewController.cs file and make it look like the following:

using System;

using AppKit;
using Foundation;

namespace MacMenus
{
    public partial class ViewController : NSViewController
    {
        #region Application Access
        public static AppDelegate App {
            get { return (AppDelegate)NSApplication.SharedApplication.Delegate; }
        }
        #endregion

        #region Computed Properties
        public override NSObject RepresentedObject {
            get {
                return base.RepresentedObject;
            }
            set {
                base.RepresentedObject = value;
                // Update the view, if already loaded.
            }
        }

        public string Text {
            get { return documentText.Value; }
            set { documentText.Value = value; }
        } 
        #endregion

        #region Constructors
        public ViewController (IntPtr handle) : base (handle)
        {
        }
        #endregion

        #region Override Methods
        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // Do any additional setup after loading the view.
        }

        public override void ViewWillAppear ()
        {
            base.ViewWillAppear ();

            App.textEditor = this;
        }

        public override void ViewWillDisappear ()
        {
            base.ViewDidDisappear ();

            App.textEditor = null;
        }
        #endregion
    }
}

외부의 텍스트 보기의 텍스트를 노출 하는이 ViewController 클래스 및 때 창이 포커스를 얻거나 잃을 앱 대리자에 게 알립니다.This exposes the text of our text view outside of the ViewController class and informs the app delegate when the window gains or loses focus. 이제 편집 합니다 AppDelegate.cs 파일을 다음과 같이 표시 되도록 합니다.Now edit the AppDelegate.cs file and make it look like the following:

using AppKit;
using Foundation;
using System;

namespace MacMenus
{
    [Register ("AppDelegate")]
    public partial class AppDelegate : NSApplicationDelegate
    {
        #region Computed Properties
        public ViewController textEditor { get; set;} = null;
        #endregion

        #region Constructors
        public AppDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override void DidFinishLaunching (NSNotification notification)
        {
            // Insert code here to initialize your application
        }

        public override void WillTerminate (NSNotification notification)
        {
            // Insert code here to tear down your application
        }
        #endregion

        #region Custom actions
        [Export ("openDocument:")]
        void OpenDialog (NSObject sender)
        {
            var dlg = NSOpenPanel.OpenPanel;
            dlg.CanChooseFiles = false;
            dlg.CanChooseDirectories = true;

            if (dlg.RunModal () == 1) {
                var alert = new NSAlert () {
                    AlertStyle = NSAlertStyle.Informational,
                    InformativeText = "At this point we should do something with the folder that the user just selected in the Open File Dialog box...",
                    MessageText = "Folder Selected"
                };
                alert.RunModal ();
            }
        }

        partial void phrasesAddress (Foundation.NSObject sender) {

            textEditor.Text += "Xamarin HQ\n394 Pacific Ave, 4th Floor\nSan Francisco CA 94111\n\n";
        }

        partial void phrasesDate (Foundation.NSObject sender) {

            textEditor.Text += DateTime.Now.ToString("D");
        }

        partial void phrasesGreeting (Foundation.NSObject sender) {

            textEditor.Text += "Dear Sirs,\n\n";
        }

        partial void phrasesSignature (Foundation.NSObject sender) {

            textEditor.Text += "Sincerely,\n\nKevin Mullins\nXamarin,Inc.\n";
        }
        #endregion
    }
}

여기 만들었습니다는 AppDelegate 정의한 Interface Builder에서 출 선 및 작업을 사용할 수 있도록 partial 클래스입니다.Here we've made the AppDelegate a partial class so that we can use the actions and outlets that we defined in Interface Builder. 도 노출 한 textEditor 는 기간은 현재 포커스를 추적할 수 있습니다.We also expose a textEditor to track which window is currently in focus.

다음 메서드는 사용자 지정 메뉴와 메뉴 항목을 처리 하는 데 사용 됩니다.The following methods are used to handle our custom menu and menu items:

partial void phrasesAddress (Foundation.NSObject sender) {

    if (textEditor == null) return;
    textEditor.Text += "Xamarin HQ\n394 Pacific Ave, 4th Floor\nSan Francisco CA 94111\n\n";
}

partial void phrasesDate (Foundation.NSObject sender) {

    if (textEditor == null) return;
    textEditor.Text += DateTime.Now.ToString("D");
}

partial void phrasesGreeting (Foundation.NSObject sender) {

    if (textEditor == null) return;
    textEditor.Text += "Dear Sirs,\n\n";
}

partial void phrasesSignature (Foundation.NSObject sender) {

    if (textEditor == null) return;
    textEditor.Text += "Sincerely,\n\nKevin Mullins\nXamarin,Inc.\n";
}

에 있는 항목의 모든 응용 프로그램을 실행 하는 경우 이제는 구를 메뉴 활성화 되 고 선택 하면 텍스트 뷰로 제공 라는 문구를 추가 합니다.Now if we run our application, all of the items in the Phrase menu will be active and will add the give phrase to the text view when selected:

실행 중인 앱의 예가An example of the app running

이제 아래로 응용 프로그램 메뉴를 사용 하 여 작업의 기초부터 했으므로 사용자 지정 상황에 맞는 메뉴를 만드는 살펴 보겠습니다.Now that we have the basics of working with the application menu bar down, let's look at creating a custom contextual menu.

코드에서 메뉴 만들기Creating menus from code

Xcode의 Interface Builder를 사용 하 여 메뉴 및 메뉴 항목을 만들기, 하는 것 외에도 Xamarin.Mac 앱을 만들기, 수정 또는 코드에서 메뉴, 하위 메뉴 또는 메뉴 항목을 제거 해야 하는 경우 시간이 있을 수 있습니다.In addition to creating menus and menu items with Xcode's Interface Builder, there might be times when a Xamarin.Mac app needs to create, modify, or remove a menu, sub-menu, or menu item from code.

다음 예제에서는 메뉴 항목 및 즉석에서 동적으로 생성 되는 하위 메뉴에 대 한 정보를 저장 하는 클래스가 만들어집니다.In the following example, a class is created to hold the information about the menu items and sub-menus that will be dynamically created on-the-fly:

using System;
using System.Collections.Generic;
using Foundation;
using AppKit;

namespace AppKit.TextKit.Formatter
{
    public class LanguageFormatCommand : NSObject
    {
        #region Computed Properties
        public string Title { get; set; } = "";
        public string Prefix { get; set; } = "";
        public string Postfix { get; set; } = "";
        public List<LanguageFormatCommand> SubCommands { get; set; } = new List<LanguageFormatCommand>();
        #endregion

        #region Constructors
        public LanguageFormatCommand () {

        }

        public LanguageFormatCommand (string title)
        {
            // Initialize
            this.Title = title;
        }

        public LanguageFormatCommand (string title, string prefix)
        {
            // Initialize
            this.Title = title;
            this.Prefix = prefix;
        }

        public LanguageFormatCommand (string title, string prefix, string postfix)
        {
            // Initialize
            this.Title = title;
            this.Prefix = prefix;
            this.Postfix = postfix;
        }
        #endregion
    }
}

메뉴 및 항목 추가Adding menus and items

이 클래스 정의 사용 하 여 다음 루틴의 컬렉션인 분석 LanguageFormatCommand개체 및 재귀적으로 빌드는에 전달 된 (Interface Builder에서 만든) 기존 메뉴의 아래쪽에 추가 하 여 새 메뉴 및 메뉴 항목:With this class defined, the following routine will parse a collection of LanguageFormatCommandobjects and recursively build new menus and menu items by appending them to the bottom of the existing menu (created in Interface Builder) that has been passed in:

private void AssembleMenu(NSMenu menu, List<LanguageFormatCommand> commands) {
    NSMenuItem menuItem;

    // Add any formatting commands to the Formatting menu
    foreach (LanguageFormatCommand command in commands) {
        // Add separator or item?
        if (command.Title == "") {
            menuItem = NSMenuItem.SeparatorItem;
        } else {
            menuItem = new NSMenuItem (command.Title);

            // Submenu?
            if (command.SubCommands.Count > 0) {
                // Yes, populate submenu
                menuItem.Submenu = new NSMenu (command.Title);
                AssembleMenu (menuItem.Submenu, command.SubCommands);
            } else {
                // No, add normal menu item
                menuItem.Activated += (sender, e) => {
                    // Apply the command on the selected text
                    TextEditor.PerformFormattingCommand (command);
                };
            }
        }
        menu.AddItem (menuItem);
    }
}

에 대 한 LanguageFormatCommand 비어 있는 개체 Title 속성을이 루틴 만듭니다를 메뉴 항목 구분 기호 (씬 회색 선) 메뉴 섹션 간:For any LanguageFormatCommand object that has a blank Title property, this routine creates a Separator menu item (a thin gray line) between menu sections:

menuItem = NSMenuItem.SeparatorItem;

제목을 제공 하는 경우 해당 제목의 새 메뉴 항목을 만들어집니다.If a title is provided, a new menu item with that title is created:

menuItem = new NSMenuItem (command.Title);

경우는 LanguageFormatCommand 개체에 하위 LanguageFormatCommand 개체에 하위 메뉴가 만들어집니다 및 AssembleMenu 메서드는 재귀적으로 해당 메뉴를 구축 하기 위해 호출 됩니다.If the LanguageFormatCommand object contains child LanguageFormatCommand objects, a sub-menu is created and the AssembleMenu method is recursively called to build out that menu:

menuItem.Submenu = new NSMenu (command.Title);
AssembleMenu (menuItem.Submenu, command.SubCommands);

하위 메뉴가 없는 모든 새 메뉴 항목에 대 한 코드는 사용자가 선택한 메뉴 항목 처리에 추가 됩니다.For any new menu item that does not have sub-menus, code is added to handle the menu item being selected by the user:

menuItem.Activated += (sender, e) => {
    // Do something when the menu item is selected
    ...
};

테스트 메뉴 만들기Testing the menu creation

모든 위치에 위의 코드를 사용 하 여 하는 경우 다음 컬렉션 LanguageFormatCommand 개체를 만들었습니다.With all of the above code in place, if the following collection of LanguageFormatCommand objects were created:

// Define formatting commands
FormattingCommands.Add(new LanguageFormatCommand("Strong","**","**"));
FormattingCommands.Add(new LanguageFormatCommand("Emphasize","_","_"));
FormattingCommands.Add(new LanguageFormatCommand("Inline Code","`","`"));
FormattingCommands.Add(new LanguageFormatCommand("Code Block","```\n","\n```"));
FormattingCommands.Add(new LanguageFormatCommand("Comment","<!--","-->"));
FormattingCommands.Add (new LanguageFormatCommand ());
FormattingCommands.Add(new LanguageFormatCommand("Unordered List","* "));
FormattingCommands.Add(new LanguageFormatCommand("Ordered List","1. "));
FormattingCommands.Add(new LanguageFormatCommand("Block Quote","> "));
FormattingCommands.Add (new LanguageFormatCommand ());

var Headings = new LanguageFormatCommand ("Headings");
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 1","# "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 2","## "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 3","### "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 4","#### "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 5","##### "));
Headings.SubCommands.Add(new LanguageFormatCommand("Heading 6","###### "));
FormattingCommands.Add (Headings);

FormattingCommands.Add(new LanguageFormatCommand ());
FormattingCommands.Add(new LanguageFormatCommand("Link","[","]()"));
FormattingCommands.Add(new LanguageFormatCommand("Image","![](",")"));
FormattingCommands.Add(new LanguageFormatCommand("Image Link","[ ![](",")](LinkImageHere)"));

있으며이 컬렉션을 전달 합니다 AssembleMenu 함수 (사용 하 여는 형식 메뉴 기본 설정), 다음 동적 메뉴 및 메뉴 항목 생성:And that collection passed to the AssembleMenu function (with the Format Menu set as the base), the following dynamic menus and menu items would be created:

실행 중인 앱에서 새 메뉴 항목The new menu items in the running app

메뉴 및 항목 제거Removing menus and items

앱의 사용자 인터페이스에서 모든 메뉴 또는 메뉴 항목을 제거 해야 하는 경우 사용할 수 있습니다 합니다 RemoveItemAt 메서드는 NSMenu 클래스 0을 지정 하 여 기반 제거할 항목의 인덱스입니다.If you need to remove any menu or menu item from the app's user interface, you can use the RemoveItemAt method of the NSMenu class simply by giving it the zero based index of the item to remove.

예를 들어, 메뉴 및 위의 루틴에 의해 생성 되는 메뉴 항목을 제거 하려면 다음 코드를 사용할 수 있습니다.For example, to remove the menus and menu items created by the routine above, you could use the following code:

public void UnpopulateFormattingMenu(NSMenu menu) {

    // Remove any additional items
    for (int n = (int)menu.Count - 1; n > 4; --n) {
        menu.RemoveItemAt (n);
    }
}

위의 코드의 경우 처음 네 가지 메뉴 항목을 만들었으므로 Xcode의 Interface Builder 및 앱에서 사용할 수 있는 주요 사항에서 동적으로 제거 되지 않습니다.In the case of the code above, the first four menu items are created in Xcode's Interface Builder and aways available in the app, so they are not removed dynamically.

상황에 맞는 메뉴Contextual menus

상황에 맞는 메뉴 사용자 마우스 오른쪽 단추로 클릭 하거나 창의 항목 컨트롤-클릭 하면 나타납니다.Contextual menus appear when the user right-clicks or control-clicks an item in a window. 기본적으로 (예: 텍스트 뷰)에 연결 하는 상황에 맞는 메뉴는 다양 한 이미 macOS에 기본 제공 되는 UI 요소입니다.By default, several of the UI elements built into macOS already have contextual menus attached to them (such as the text view). 그러나 때 창에 추가 하는 UI 요소에 대 한 고유한 사용자 지정 상황에 맞는 메뉴를 생성 하려는 경우가 있을 수 있습니다.However, there might be times when we want to create our own custom contextual menus for a UI element that we have added to a window.

편집할 우리의 Main.storyboard Xcode에서 파일을 추가 이 디자인 창을 설정 해당 클래스 에서 "NSPanel"에 Id 검사기, 새 Assistant 항목을 메뉴를 사용 하 여 새 창에 연결을 Segue 표시:Let's edit our Main.storyboard file in Xcode and add a Window window to our design, set its Class to "NSPanel" in the Identity Inspector, add a new Assistant item to the Window menu, and attach it to the new window using a Show Segue:

Segue 형식 설정Setting the segue type

다음을 수행 하겠습니다.Let's do the following:

  1. 끌어서를 레이블을 에서 합니다 라이브러리 검사기패널 창 "Property"를 해당 텍스트를 설정 하 고:Drag a Label from the Library Inspector onto the Panel window and set its text to "Property":

    레이블 값을 편집Editing the label's value

  2. 다음 끌어를 메뉴 에서 합니다 라이브러리 검사기 뷰 계층 구조 및 이름 바꾸기 세 가지 기본 메뉴 항목에서 뷰 컨트롤러를 문서, 텍스트 하 고 글꼴:Next drag a Menu from the Library Inspector onto the View Controller in the View Hierarchy and rename the three default menu items Document, Text and Font:

    필요한 메뉴 항목The required menu items

  3. 컨트롤 끌기 이제 합니다 속성 레이블메뉴:Now control-drag from the Property Label onto the Menu:

    Segue를 만들려면 끌기Dragging to create a segue

  4. 팝업 대화 상자에서 선택 메뉴:From the popup dialog, select Menu:

    Segue 형식 설정Setting the segue type

  5. 검사기, "PanelViewController" 뷰 컨트롤러의 클래스를 설정 합니다.From the Identity Inspector, set the View Controller's class to "PanelViewController":

    Segue 클래스 설정Setting the segue class

  6. 동기화 하는 Mac 용 Visual Studio로 다시 전환 하 면 Interface Builder를 반환 합니다.Switch back to Visual Studio for Mac to sync, then return to Interface Builder.

  7. 전환할 합니다 도우미 편집기 선택한 합니다 PanelViewController.h 파일입니다.Switch to the Assistant Editor and select the PanelViewController.h file.

  8. 에 대 한 작업 만들기를 문서 메뉴 항목 이라는 propertyDocument:Create an action for the Document menu item called propertyDocument:

    동작 구성Configuring the action

  9. 나머지 메뉴 항목에 대 한 만들기 작업을 반복 합니다.Repeat creating actions for the remaining menu items:

    필요한 작업을The required actions

  10. 마지막에 대 한 콘센트를 작성 합니다 속성 레이블 호출 propertyLabel:Finally create an outlet for the Property Label called propertyLabel:

    구성 콘센트Configuring the outlet

  11. 변경 내용을 저장 하 고 Xcode와 동기화 하는 Mac 용 Visual Studio로 돌아갑니다.Save your changes and return to Visual Studio for Mac to sync with Xcode.

편집 된 PanelViewController.cs 파일과 다음 코드를 추가 합니다.Edit the PanelViewController.cs file and add the following code:

partial void propertyDocument (Foundation.NSObject sender) {
    propertyLabel.StringValue = "Document";
}

partial void propertyFont (Foundation.NSObject sender) {
    propertyLabel.StringValue = "Font";
}

partial void propertyText (Foundation.NSObject sender) {
    propertyLabel.StringValue = "Text";
}

이제 응용 프로그램을 실행 하 고 속성 레이블 패널에서 마우스 오른쪽 단추로 클릭, 우리의 사용자 지정 상황에 맞는 메뉴를 알아봅니다.Now if we run the application and right-click on the property label in the panel, we'll see our custom contextual menu. 선택 하 고 메뉴에서 항목을 레이블의 값이 변경 됩니다.If we select and item from the menu, the label's value will change:

실행 상황에 맞는 메뉴The contextual menu running

다음 상태 표시줄 메뉴 만들기에 대해 살펴보겠습니다.Next let's look at creating status bar menus.

상태 표시줄 메뉴Status bar menus

상태 표시줄 메뉴는 메뉴 또는 응용 프로그램의 상태를 반영 하며 이미지와 같은 사용자에 게 피드백와의 상호 작용을 제공 하는 상태 메뉴 항목의 컬렉션을 표시 합니다.Status bar menus display a collection of status menu items that provide interaction with or feedback to the user, such as a menu or an image reflecting an application’s state. 응용 프로그램의 상태 표시줄 메뉴 응용 프로그램이 백그라운드에서 실행 되는 경우에 되 고 활성화 됩니다.An application's status bar menu is enabled and active even if the application is running in the background. 시스템 차원의 상태 표시줄 응용 프로그램 메뉴 표시줄의 오른쪽에 상주 하며 현재 macOS에서 사용할 수 있는 유일한 상태 표시줄입니다.The system-wide status bar resides at the right side of the application menu bar and is the only Status Bar currently available in macOS.

편집할 우리의 AppDelegate.cs 파일을 확인 합니다 DidFinishLaunching 다음과 같은 메서드 확인:Let's edit our AppDelegate.cs file and make the DidFinishLaunching method look like the following:

public override void DidFinishLaunching (NSNotification notification)
{
    // Create a status bar menu
    NSStatusBar statusBar = NSStatusBar.SystemStatusBar;

    var item = statusBar.CreateStatusItem (NSStatusItemLength.Variable);
    item.Title = "Text";
    item.HighlightMode = true;
    item.Menu = new NSMenu ("Text");

    var address = new NSMenuItem ("Address");
    address.Activated += (sender, e) => {
        PhraseAddress(address);
    };
    item.Menu.AddItem (address);

    var date = new NSMenuItem ("Date");
    date.Activated += (sender, e) => {
        PhraseDate(date);
    };
    item.Menu.AddItem (date);

    var greeting = new NSMenuItem ("Greeting");
    greeting.Activated += (sender, e) => {
        PhraseGreeting(greeting);
    };
    item.Menu.AddItem (greeting);

    var signature = new NSMenuItem ("Signature");
    signature.Activated += (sender, e) => {
        PhraseSignature(signature);
    };
    item.Menu.AddItem (signature);
}

NSStatusBar statusBar = NSStatusBar.SystemStatusBar; 액세스를 제공 시스템 차원의 상태 표시줄에 있습니다.NSStatusBar statusBar = NSStatusBar.SystemStatusBar; gives us access to the system-wide status bar. var item = statusBar.CreateStatusItem (NSStatusItemLength.Variable); 새 상태 모음 항목을 만듭니다.var item = statusBar.CreateStatusItem (NSStatusItemLength.Variable); creates a new status bar item. 여기에서 메뉴 및 메뉴 항목의 수를 만들고 메뉴를 방금 만든 상태 표시줄 항목에 연결 합니다.From there we create a menu and a number of menu items and attach the menu to the status bar item we just created.

응용 프로그램을 실행 하는 경우 새 상태 모음 항목 표시 됩니다.If we run the application, the new status bar item will be displayed. 메뉴에서 항목을 선택 하면 텍스트 보기에 있는 텍스트를 변경 됩니다.Selecting an item from the menu will change the text in the text view:

실행 상태 표시줄 메뉴The status bar menu running

다음으로, 사용자 지정 도킹 메뉴 항목을 만들기에 대해 살펴보겠습니다.Next, let's look at creating custom dock menu items.

사용자 지정 도킹 메뉴Custom dock menus

도킹 메뉴를 마우스 오른쪽 단추로 클릭 또는 도킹 스테이션에서 응용 프로그램의 아이콘 컨트롤-클릭 하는 경우 Mac 응용 프로그램에 대 한 표시 됩니다.The dock menu appears for you Mac application when the user right-clicks or control-clicks the application's icon in the dock:

사용자 지정 메뉴 도킹A custom dock menu

다음을 수행 하 여 응용 프로그램에 대 한 사용자 지정 도킹 메뉴를 만들어 보겠습니다.Let's create a custom dock menu for our application by doing the following:

  1. Mac 용 Visual Studio에서 마우스 오른쪽 단추로 클릭 응용 프로그램의 프로젝트 및 선택 추가 > 새 파일... 새 파일 대화 상자에서 선택 Xamarin.Mac > 빈 인터페이스 정의, "DockMenu" 하는 데는 이름 을 클릭 합니다 새로 만들기 만들 새 단추 DockMenu.xib 파일:In Visual Studio for Mac, right-click on the application's project and select Add > New File... From the new file dialog, select Xamarin.Mac > Empty Interface Definition, use "DockMenu" for the Name and click the New button to create the new DockMenu.xib file:

    빈 인터페이스 정의 추가Adding an empty interface definition

  2. Solution Pad, 두 번 클릭 합니다 DockMenu.xib Xcode에서 편집 하기 위해 열려는 파일입니다.In the Solution Pad, double-click the DockMenu.xib file to open it for editing in Xcode. 메뉴 다음 항목: 주소하십시오 날짜인사말, 및 서명Create a new Menu with the following items: Address, Date, Greeting, and Signature

    UI를 레이아웃할Laying out the UI

  3. 그런 다음에 사용자 지정 메뉴에 대 한 만든이 기존 작업에는 새 메뉴 항목을 연결 하겠습니다 합니다 추가, 편집 및 삭제 메뉴 위의 섹션.Next, let's connect our new menu items to our existing actions that we created for our custom menu in the Adding, Editing and Deleting Menus section above. 전환할 합니다 연결 검사기 선택한를 첫 번째 응답자인터페이스 계층 구조.Switch to the Connection Inspector and select the First Responder in the Interface Hierarchy. 아래로 스크롤하여 찾을 phraseAddress: 동작 합니다.Scroll down and find the phraseAddress: action. 원 줄 해당 작업을 끌기에 합니다 주소 메뉴 항목:Drag a line from the circle on that action to the Address menu item:

    연결 작업을 끌어Dragging to wire up an action

  4. 모든 해당 액션에 연결할 다른 메뉴 항목에 대해 반복 합니다.Repeat for all of the other menu items attaching them to their corresponding actions:

    필요한 작업을The required actions

  5. 다음으로, 선택는 응용 프로그램인터페이스 계층 구조합니다.Next, select the Application in the Interface Hierarchy. 연결 검사기, 원을에서 줄을 끌어 놓습니다는 dockMenu 작동 시키기 위해 방금 만든 메뉴:In the Connection Inspector, drag a line from the circle on the dockMenu outlet to the menu we just created:

    콘센트를 연결할 끌어Dragging the wire up the outlet

  6. 변경 내용을 저장 하 고 Xcode와 동기화 하는 Mac 용 Visual Studio로 다시 전환 합니다.Save your changes and switch back to Visual Studio for Mac to sync with Xcode.

  7. 두 번 클릭 합니다 Info.plist 파일을 편집용으로 엽니다.Double-click the Info.plist file to open it for editing:

    Info.plist 파일 편집Editing the Info.plist file

  8. 클릭 합니다 원본 화면 아래쪽에 있는 탭:Click the Source tab at the bottom of the screen:

    원본 뷰 선택Selecting the Source view

  9. 클릭 새 항목 추가녹색 더하기 단추 클릭, "AppleDockMenu"에 속성 이름 및 "DockMenu" (확장명 없이 새.xib 파일의 이름) 값을 설정 합니다.Click Add new entry, click the green plus button, set the property name to "AppleDockMenu" and the value to "DockMenu" (the name of our new .xib file without the extension):

    DockMenu 항목 추가Adding the DockMenu item

이제 응용 프로그램을 실행 하 고 도킹 스테이션에서 해당 아이콘을 마우스 오른쪽 단추로 클릭, 우리의 새 메뉴 항목이 표시 됩니다.Now if we run our application and right-click on its icon in the Dock, our new menu items will be displayed:

도킹 메뉴 실행 예가An example of the dock menu running

메뉴에서 사용자 지정 항목 중 하나를 선택, 텍스트 뷰에 텍스트 수정 됩니다.If we select one of the custom items from the menu, the text in our text view will be modified.

팝업 단추 및 드롭다운 목록Pop-up button and pull-down lists

팝업 단추는 선택한 항목을 표시 하 고 사용자가 클릭할 때 선택할 옵션 목록을 제공 합니다.A pop-up button displays a selected item and presents a list of options to select from when clicked by the user. 드롭다운 목록에는 일반적으로 현재 작업의 컨텍스트에 관련 특정 명령을 선택할 때 사용 되는 팝업 단추 형식입니다.A pull-down list is a type of pop-up button usually used for selecting commands specific to the context of the current task. 둘 다 창의 아무 곳 이나 나타날 수 있습니다.Both can appear anywhere in a window.

다음을 수행 하 여 응용 프로그램에 대 한 사용자 지정 팝업 단추를 만들어 보겠습니다.Let's create a custom pop-up button for our application by doing the following:

  1. 편집 합니다 Main.storyboard 놓습니다 Xcode에서 파일을 팝업 단추 에서 라이브러리 검사기패널 창에서 만든 합니다 상황에 맞는 메뉴 섹션:Edit the Main.storyboard file in Xcode and drag a Popup Button from the Library Inspector onto the Panel window we created in the Contextual Menus section:

    단추 추가 하는 팝업Adding a popup button

  2. 새 메뉴 항목을 추가 하 고를 팝업에서 항목의 제목을 설정 합니다. 주소하십시오 날짜인사말, 및 서명Add a new menu item and set the titles of the Items in the Popup to: Address, Date, Greeting, and Signature

    메뉴 항목을 구성Configuring the menu items

  3. 다음으로 사용자 지정 메뉴에서 만든 기존 작업에는 새 메뉴 항목을 연결 하겠습니다 합니다 추가, 편집 및 삭제 메뉴 위의 섹션입니다.Next, let's connect our new menu items to the existing actions that we created for our custom menu in the Adding, Editing and Deleting Menus section above. 전환할 합니다 연결 검사기 선택한를 첫 번째 응답자인터페이스 계층 구조.Switch to the Connection Inspector and select the First Responder in the Interface Hierarchy. 아래로 스크롤하여 찾을 phraseAddress: 동작 합니다.Scroll down and find the phraseAddress: action. 원 줄 해당 작업을 끌기에 합니다 주소 메뉴 항목:Drag a line from the circle on that action to the Address menu item:

    연결 작업을 끌어Dragging to wire up an action

  4. 모든 해당 액션에 연결할 다른 메뉴 항목에 대해 반복 합니다.Repeat for all of the other menu items attaching them to their corresponding actions:

    작업에 필요한 모든All required actions

  5. 변경 내용을 저장 하 고 Xcode와 동기화 하는 Mac 용 Visual Studio로 다시 전환 합니다.Save your changes and switch back to Visual Studio for Mac to sync with Xcode.

이제 응용 프로그램을 실행 하 고 팝업에서 항목을 선택, 텍스트 보기에 있는 텍스트 변경 됩니다.Now if we run our application and select an item from the popup, the text in our text view will change:

실행 팝업의 예로An example of the popup running

수 만들고 팝업 단추와 정확히 동일한 방식으로 풀 다운 목록을 사용 하 여 작동 합니다.You can create and work with pull-down lists in the exact same way as pop-up buttons. 기존 작업에 연결 하는 대신 만들 수는 상황에 맞는 메뉴에서 수행한 것 처럼 사용자 고유의 사용자 지정 작업을 상황에 맞는 메뉴 섹션입니다.Instead of attaching to existing action, you could create your own custom actions just like we did for our contextual menu in the Contextual Menus section.

요약Summary

이 문서에서는 자세히 살펴보고 메뉴 및 Xamarin.Mac 응용 프로그램에서 메뉴 항목을 사용 하 여 작업을 수행 했습니다.This article has taken a detailed look at working with menus and menu items in a Xamarin.Mac application. 먼저 하 고 상황에 맞는 메뉴를 만들기에 대해 살펴보았습니다, 다음 상태 표시줄 메뉴 검사할 사용자 지정 도킹 메뉴 응용 프로그램의 메뉴 표시줄을 검사 했습니다.First we examined the application's menu bar, then we looked at creating contextual menus, next we examined status bar menus and custom dock menus. 마지막으로 앞서 설명한 팝업 메뉴 및 풀 다운 목록.Finally, we covered pop-up menus and pull-down Lists.