Как превратить Windows 11 в macOS Monterey. Все настраивается за 5 минут

В закладки
Пользователи Windows во все времена любили кастомизировать операционную систему под себя и всячески менять внешний вид стандартных элементов интерфейса. Особой популярностью пользуются темы оформления (так называемые паки), которые одним махом превращают “винду” в Linux, macOS или какую-нибудь мобильную операционную систему.
Я и сам лет 15 назад всячески “украшал” рабочий стол своего Windows-PC, перенося на него диковинную док-панель из мира OS X.
Сегодня кастомизация вышла на новый уровень. Вместо самостоятельной сборки из нескольких слабо совместимых между собой утилит и ручной замены системных файлов появились комплексные решения, которые делают все в автоматическом режиме.
Одним из таких решений мы и воспользуемся сегодня, чтобы превратить Windows 11 (или Windows 10 при желании) в операционную систему Apple.
Как настроить внешний вид Windows в стиле macOS
Для простоты и удобства воспользуемся комплексным решением от китайских разработчиков. Они выпустили утилиту MyDockFinder, которая маскирует большинство элементов рабочего стола Windows и добавляет недостающие модули из macOS вроде док-панели или меню Launchpad.
Не стоит переживать насчет содержимого утилиты. Её исходный код доступен на GitHub, а коммерческая версия приложения даже продается в Steam за 277 руб.
Для проверки работоспособности и ознакомления рекомендуем воспользоваться сборкой с GitHub, а в дальнейшем при желании отблагодарить создателей всегда сможете купить MyDockFinder в Steam.

2. Распакуйте загруженный архив и перенесите его на системный диск. Желательно, чтобы в названии пути не встречалась кириллица.

3. Запустите приложение Mydock. Еще в данной папке расположен установщик Microsoft Visual C++. Запустите его, если еще не устанавливали данный пакет библиотек. Они необходимы для полноценной работы MyDockFinder.

4. Выдайте необходимые разрешения при первом запуске приложения.

5. Сразу же увидите узнаваемые элементы операционной системы macOS: док-панель и строку меню. В верхнюю панель переехали все иконки и индикаторы из трея Windows.
Для перехода к параметрам приложения нужно вызвать контекстное меню в месте разделительной панели Дока и выбрать пункт Preferences.

6. Настроек у приложения MyDockFinder даже больше, чем у аналогичных элементов в macOS.
В разделе параметров Global settings указывается размер элементов интерфейса, тема оформления, цветовой акцент и возможность автоматического запуска утилиты при старте системы.

7. В меню General можно изменить размер Док-панели, включить или отключить увеличение иконок при наведении и задать ряд других дополнительных настроек.
Как и в оригинальной macOS панель с иконками может располагаться у нижнего края экрана или у одной из боковых граней.

8. В блоке настроек Advanced есть аналог фишки Активные углы, который позволяет задать действия при наведении курсора в выбранную область рабочего стола.

9. В разделах Minimize window и Window Preview настраивается поведение окон и приложений в док-панели. Можно настроить привычную для Windows группировку окон или скрывать их в иконку приложения, как в macOS.

10. Особого внимания заслуживает блок параметров Audio. Здесь можно изменить стандартную графику для регулировки уровня громкости компьютера. Можно оставить классический Windows-индикатор, стандартное меню из macOS или минималистичный боковой слайдер из iOS.
Здесь же можно назначить клавиши управления громкостью при отсутствии мультимедийных кнопок на клавиатуре.

11. Раздел настроек Monitor позволяет добавить в строку меню системные индикаторы. Прямого аналога данной фишке в macOS нет, но разработчики явно вдохновлялись утилитой iStat Menus.
Можно вывести индикатор загруженности процессора, оперативной памяти, видеоадаптера и свободное место на накопителе.

12. После настройки всех элементов останется найти и установить подходящие обои. Не забудьте перезагрузить компьютер для вступления в силу новых параметров.
В качестве финального штриха можете отключить отображение системных иконок на рабочем столе ОС. Чаще всего там остается мусорная корзина. Отключаются иконки по пути Системные настройки – Персонализация – Темы – Параметры значков рабочего стола.
После перезагрузки рабочий стол вашего Windows-компьютера будет на 99% походить на новую macOS Monterey.
Как работать в Windows после установки MyDockFinder

Как видите, приложение для изменения внешнего вида операционной системы является комплексным и переносит не только док-панель, но и ряд других элементов macOS.
Во-первых, вы получаете удобную строку меню, в которой содержатся все настройки утилиты и некоторые параметры запускаемых приложений. К сожалению, перенести все пункты меню разных программ в верхний бар невозможно.
Во-вторых, строка меню в стиле macOS является более функциональным аналогом трея из Windows. Здесь предусмотрены всплывающие меню для разных системных индикаторов вроде Wi-Fi, Bluetooth, индикатора громкости и т.п.
Особого внимания заслуживает Пункт управления, который с первого взгляда не отличить от оригинального “яблочного”. Все элементы здесь функционируют и управляют параметрами системы.
В-третьих, MyDockFinder заменяет некоторые системные меню и диалоговые окна, которые начинают выглядеть более эстетично и не выбиваются из общей стилистики.

В-четвертых, появляется некий аналог Launchpad. Сюда придется вручную перенести ярлыки нужных вам приложений. Можете поискать программы в папке Program Files либо выполнить общий поиск файлов *.exe на системном диске и перетянуть в меню нужные.
После настройки меню выглядит с точно как родной “ланчпэд” из macOS. Вы сможете в любой момент отредактировать набор приложений в нем.

В-пятых, основные элементы операционной системы Windows будут доступны из нового интерфейса. Так при запуске Finder будет открываться привычный файловый менеджер от Microsoft, вместо поиска Spotlight в строке меню будет запускаться глобальный поиск по Windows, а нажатие на одноименную кнопку откроет стандартное меню Пуск.
Не забывайте и о скрытых пунктах меню за индикатором , там есть стандартное меню выключения и перезагрузки компьютера, доступ к системным параметрам и Microsoft Store.
Лично мне понравилось приложение MyDockFinder. Это качественная комплексная утилита для изменения операционной системы Windows “все в одном”. Единое приложение меняет большое количество элементов и делает систему максимально схожей с macOS.
Вам не придется устанавливать с десяток приложений, менять системные файлы и возиться с подстройкой элементов. Все параметры задаются в одном понятном меню настроек, а фишки не конфликтуют друг с другом. Удаляется MyDockFinder быстро и беспроблемно. Нужно просто отключить утилиту из контекстного меню и удалить содержащую все файлы папку.
Если вы большую часть времени работаете с macOS, но периодически заглядываете в Windows – можете смело устанавливать MyDockFinder, чтобы быстрее адаптироваться в данной операционной системе.
Начало работы с панелью управления Boot Camp на компьютере Mac

После установки Windows на компьютере Mac с процессором Intel с помощью Ассистента Boot Camp можно использовать панель управления Boot Camp для настройки параметров Boot Camp и устройств.
Открытие панели управления Boot Camp в Windows

- В ОС Windows на Mac нажмите в панели задач справа.
- Нажмите значок Boot Camp , затем выберите пункт «Панель управления Boot Camp».
- Если появится окно «Контроль учетных записей пользователей», нажмите «Да».
Открытие Руководства пользователя панели управления Boot Camp в Windows

- В ОС Windows на Mac нажмите в панели задач справа.
- Нажмите значок Boot Camp , затем выберите пункт «Справка Boot Camp».
Закрепление панели управления Boot Camp в панели задач Windows
В ОС Windows на Mac выполните одно из следующих действий.

- Нажмите справа в панели задач, затем перетяните значок Boot Camp в панель задач.
- Введите «настройки панели задач» в поле поиска панели задач, нажмите «Выберите значки, отображаемые в панели задач» и установите флажок Boot Camp Manager.
- В меню «Пуск» выберите «Параметры» > «Персонализация» > «Панель задач» > «Выберите значки, отображаемые в панели задач» и установите флажок Boot Camp Manager.
Как активировать Touch Bar в Windows 10
В 2016 году Apple серьёзно обновила линейку MacBook Pro, добавив сенсорную панель Touch Bar. Изначально, эта идея казалось беспроигрышной — пользователь получал дополнительный экран, с помощью которого можно было напрямую взаимодействовать с приложениями. Однако, даже спустя четыре года Touch Bar не обрёл должной популярности среди пользователей. Наибольшее недовольство среди владельцев MacBook Pro вызывает тот факт, что сенсорная панель полностью заменила собой функциональные клавиши. Помимо всего прочего, Touch Bar абсолютно бесполезен в Windows 10 и в других операционных системах. По крайней мере, так было до этого момента.

Одна из главных проблем Touch Bar — отсутствие поддержки других операционных систем. На Windows 10 сенсорная панель отображает только функциональные клавиши — для управления мультимедиа, громкостью и яркостью экрана. Но в скором времени всё может измениться.
Один из разработчиков решил устранить этот досадный недостаток. С помощью нехитрых манипуляций, энтузиаст смог перенести панель «Пуск» в Windows 10 прямо на Touch Bar.

Конечно, до уровня адаптации macOS ещё далеко. Однако уже сейчас пользователи могут быстро переключаться между программами и задачами, а также включать поиск или голосового помощника Cortana.
По необходимости, меню «Пуск» можно убрать с основного экрана и, тем самым, освободить дополнительное полезное пространство для приложений.
Как перенести панель «Пуск» на Touch Bar
Разработчик отмечает, что инструкция по переносу будет работать только на ноутбуках с чипом Apple T2.
- Отключаем опцию «Безопасной загрузки» используя режим восстановления;
- Затем загружаем и устанавливаем среду разработки Visual Studio 2019, а также Windows 10 Driver Kit;
- Затем следует загрузить специальные драйвера из официального репозитория разработчика;
- Устанавливаем драйвер DFRUsbCcgp.inf для устройства «Apple Touch Bar» и DFRDisplayKm.inf для устройства «Bridge Display;
- Всё готово. Осталось перезагрузить MacBook Pro.

В дальнейшем разработчик планирует добавить опции для управления некоторыми встроенными приложениями Windows 10. Нам остается только ждать обновлений.
Предлагаем подписаться на наш канал в «Яндекс.Дзен». Там вы сможете найти эксклюзивные материалы, которых нет на сайте.
Наши соцсети
Новости, статьи и анонсы публикаций
Свободное общение и обсуждение материалов
Лонгриды для вас

Если доступ к приложению или игре ограничены в России разработчиком, а VPN не помогает, попробуйте обмануть геолокацию на Айфоне. Нашли самый лучший способ, с которым справится даже ребенок

Для легкой передачи файлов с Айфона на компьютер и обратно, синхронизации вызовов, сообщений и загрузки фотографий не обязательно покупать дорогой Mac. С этим спокойно справится любой компьютер на Windows, а вы сэкономите приличную сумму.

Если пользоваться ноутбуком на улице, он может быстро износиться, начать тормозить или и вовсе сгореть. Звучит страшно, но надо понимать, почему так происходит и что вы сможете сделать, чтобы обезопасить себя от этого. Разбираемся, можно ли работать с ноутбуком в парках.
Windows в Xamarin.Mac
В этой статье рассматривается работа с окнами и панелями в приложении Xamarin.Mac. Здесь описывается создание окон и панелей в Xcode и Конструкторе интерфейсов, их загрузка из раскадровки и XIB-файлов, а также работа с ними программным способом.
При работе с C# и .NET в приложении Xamarin.Mac у вас есть доступ к тем же Windows и Панелям, что и разработчик, работающий с Objective-CXcode . Так как Xamarin.Mac интегрируется напрямую с Xcode, вы можете использовать конструктор интерфейсов Xcode для создания и обслуживания windows и панелей (или при необходимости создавать их непосредственно в коде C#).
В зависимости от своего назначения приложение Xamarin.Mac может представить один или несколько Windows на экране для управления и координации информации, с которыми оно отображается и с которым работает. Основные функции окна:
- Для предоставления области, в которой можно размещать представления и элементы управления и управлять ими.
- Чтобы принимать события и реагировать на них в ответ на взаимодействие пользователя с клавиатурой и мышью.
Windows можно использовать в режиме без режима (например, в текстовом редакторе, который может одновременно открывать несколько документов) или модальном (например, в диалоговом окне экспорта, которое необходимо закрыть, прежде чем приложение сможет продолжить работу).
Панели — это особый тип Окна (подкласс базового NSWindow класса), который обычно выполняет вспомогательную функцию в приложении, например служебные окна, такие как инспекторы текстового формата и системный элемент выбора цвета.

В этой статье мы рассмотрим основы работы с Windows и панелями в приложении Xamarin.Mac. Настоятельно рекомендуется сначала ознакомиться со статьей Hello, Mac , в частности в разделах Введение в Xcode и Interface Builder и Выходы и Действия , так как в ней рассматриваются основные понятия и методы, которые мы будем использовать в этой статье.
Вы также можете ознакомиться с разделом Предоставление классов и методов Objective-CC# в документе Xamarin.Mac Internals. В нем описываются Register команды и Export , используемые для подключения классов C# к Objective-C объектам и элементам пользовательского интерфейса.
Общие сведения о windows
Как упоминалось выше, окно предоставляет область, в которой можно размещать представления и элементы управления, а также реагировать на события в зависимости от взаимодействия с пользователем (с помощью клавиатуры или мыши).
По данным Apple, существует пять main типов Windows в приложении macOS:
- Окно документа — окно документа содержит пользовательские данные на основе файлов, такие как электронная таблица или текстовый документ.
- Окно приложения — это окно main приложения, которое не основано на документах (например, приложение «Календарь» на компьютере Mac).
- Панель — панель над другими окнами и предоставляет инструменты или элементы управления, с которыми пользователи могут работать при открытии документов. В некоторых случаях панель может быть полупрозрачной (например, при работе с большой графикой).
- Dialog — диалоговое окно отображается в ответ на действие пользователя и обычно предоставляет способы выполнения действия. Диалоговое окно требует ответа от пользователя, прежде чем его можно будет закрыть. (См . раздел Работа с диалогами)
- Оповещения — это специальный тип диалогового окна, который появляется при возникновении серьезной проблемы (например, ошибки) или в виде предупреждения (например, при подготовке к удалению файла). Так как оповещение — это диалоговое окно, оно также требует ответа пользователя, прежде чем его можно будет закрыть. (См . раздел Работа с оповещениями)
Дополнительные сведения см. в разделе Сведения о Windowsв темах оформления macOS от Apple.
Главное, ключевое и неактивное окна
Windows в приложении Xamarin.Mac может выглядеть и вести себя по-разному в зависимости от того, как пользователь взаимодействует с ними в настоящее время. Основное окно документа или приложения, которое в настоящее время находится в центре внимания пользователя, называется главным окном. В большинстве случаев это окно также будет ключевым окном (окном, которое в настоящее время принимает введенные пользователем данные). Но это не всегда так, например, может быть открыто средство выбора цвета, которое является ключевым окном, с которым взаимодействует пользователь, чтобы изменить состояние элемента в окне документа (которое по-прежнему будет главным окном).
Главное и ключевое окна (если они являются отдельными) всегда активны, а неактивные — это открытые окна, которые не находятся на переднем плане. Например, в приложении текстового редактора может быть открыто несколько документов одновременно, только главное окно будет активным, а все остальные — неактивными.
Дополнительные сведения см. в разделе Сведения о Windowsв темах оформления macOS от Apple.
Именование окон
Окно может отображать строку заголовка, и при отображении заголовка обычно это имя приложения, имя документа, над которым выполняется работа, или функция окна (например, Inspector). Некоторые приложения не отображают строку заголовка, так как они распознаются по виду и не работают с документами.
Apple предлагает следующие рекомендации:
- Используйте имя приложения для заголовка окна main, не являющегося документом.
- Присвойте новому окну untitled документа имя . Для первого нового документа не добавляйте число к заголовку (например untitled 1 , ). Если пользователь создает новый документ перед сохранением и принудлением первого, вызовите это окно untitled 2 , untitled 3 и т. д.
Дополнительные сведения см. в разделе Именование Windowsв темах дизайна macOS от Apple.
Полноэкранные окна
В macOS окно приложения может переходить в полноэкранный режим, скрывая все, включая строку меню приложения (которую можно отобразить, переместив курсор в верхнюю часть экрана), чтобы обеспечить свободное отвлечение при взаимодействии с его содержимым.
Apple предлагает следующие рекомендации:
- Определите, имеет ли смысл открыть окно в полноэкранный режим. Приложения, обеспечивающие кратковременное взаимодействие (например, калькулятор), не должны предоставлять полноэкранный режим.
- Показывать панель инструментов, если она требуется для полноэкранной задачи. Обычно панель инструментов скрыта в полноэкранном режиме.
- В полноэкранном окне должны быть все функции, необходимые пользователям для выполнения задачи.
- По возможности избегайте взаимодействия с Finder, пока пользователь находится в полноэкранном окне.
- Воспользуйтесь преимуществами увеличенного пространства экрана без смещения фокуса с main задачи.
Панели
Панель — это вспомогательное окно, содержащее элементы управления и параметры, влияющие на активный документ или выбор (например, системный элемент выбора цвета):

Панели могут быть как для конкретного приложения , так и для всей системы. App-Specific Панели перемещают в верхней части окон документов приложения и исчезают, когда приложение находится в фоновом режиме. Системные панели (например, панель «Шрифты «) отображаются поверх всех открытых окон независимо от приложения.
Apple предлагает следующие рекомендации:
- Как правило, используйте стандартную панель, прозрачные панели следует использовать только экономно и для графически ресурсоемких задач.
- Рассмотрите возможность использования панели, чтобы предоставить пользователям простой доступ к важным элементам управления или сведениям, непосредственно влияющим на их задачу.
- Скрытие и отображение панелей при необходимости.
- Панели всегда должны содержать строку заголовка.
- Панели не должны содержать активную кнопку свернуть.
Инспекторов
Большинство современных приложений macOS предоставляют вспомогательные элементы управления и параметры, влияющие на активный документ или выбор, в качестве инспекторов , которые являются частью главного окна (например, приложение Pages , показанное ниже), вместо использования окон панелей:

Дополнительные сведения см. в разделе Панелив темах дизайна macOS от Apple и нашем примере приложения MacInspector для полной реализации интерфейса inspector в приложении Xamarin.Mac.
Создание и обслуживание окон в Xcode
При создании нового приложения Xamarin.Mac Cocoa по умолчанию отображается стандартное пустое окно. Это окно определяется в .storyboard файле, автоматически включенном в проект. Чтобы изменить макет окна, в Обозреватель решений дважды щелкните Main.storyboard файл:

Откроется макет окна в конструкторе интерфейсов Xcode:

В инспекторе атрибутов есть несколько свойств, которые можно использовать для определения окна и управления ими:
- Title — это текст, который будет отображаться в строке заголовка окна.
- Автосохранение — это ключ , который будет использоваться для идентификации окна при автоматическом сохранении его положения и параметров.
- Строка заголовка — отображается ли в окне строка заголовка.
- Унифицированный заголовок и панель инструментов . Если окно содержит панель инструментов, она должна быть частью заголовка окна.
- Представление полноразмерного содержимого — позволяет области содержимого окна находиться под заголовком окна.
- Тень — имеет ли окно тень.
- Текстурированные — текстурированные окна могут использовать эффекты (например, vibrancy) и перемещаться, перетаскивая их в любое место на теле.
- Закрыть — есть ли в окне кнопка закрытия.
- Свернуть — есть ли в окне кнопка свернуть.
- Изменение размера — имеет ли окно элемент управления изменением размера.
- Кнопка панели инструментов — есть ли в окне кнопка скрытия/отображения панели инструментов.
- Возможности восстановления — положение и параметры окна автоматически сохраняются и восстанавливаются.
- Видимый при запуске — окно, автоматически отображаемое при загрузке .xib файла.
- Скрыть при деактивации — окно скрыто при входе приложения в фоновый режим.
- Освобождение при закрытии — окно очищается из памяти при закрытии.
- Всегда отображать всплывающие подсказки — постоянно ли отображаются подсказки.
- Пересчитывает цикл представления — порядок представления, пересчитываемый перед рисованием окна.
- Spaces, Exposé и Cycling — все определяет поведение окна в этих средах macOS.
- Полноэкранный режим — определяет, может ли это окно перейти в полноэкранный режим.
- Анимация — управляет типом анимации, доступной для окна.
- Внешний вид — управляет внешним видом окна. На данный момент есть только одно появление, Aqua.
Дополнительные сведения см. в документации Apple Introduction to Windows and NSWindow( Введение в Windows и NSWindow ).
Установка размера и расположения по умолчанию
Чтобы задать начальное положение окна и управлять его размером, перейдите в инспектор размеров:

Здесь можно задать начальный размер окна, присвоить ему минимальный и максимальный размер, задать начальное расположение на экране и управлять границами вокруг окна.
Настройка пользовательского контроллера окна main
Чтобы иметь возможность создавать точки и действия для предоставления элементов пользовательского интерфейса коду C#, приложение Xamarin.Mac должно использовать настраиваемый контроллер окон.
Выполните следующие действия:
- Откройте раскадровки приложения в конструкторе интерфейсов Xcode.
- Выберите в NSWindowController области конструктора.
- Перейдите в представление Identity Inspector (Инспектор удостоверений ) и введите WindowController в качестве имени класса:

- Сохраните изменения и вернитесь к Visual Studio для Mac для синхронизации.
- Файл WindowController.cs будет добавлен в проект в Обозреватель решений в Visual Studio для Mac:

- Повторно откройте раскадровки в конструкторе интерфейсов Xcode.
- Файл WindowController.h будет доступен для использования:

Добавление элементов пользовательского интерфейса
Чтобы определить содержимое окна, перетащите элементы управления из инспектора библиотеки в редактор интерфейсов. Дополнительные сведения об использовании Конструктора интерфейсов для создания и включения элементов управления см. в документации по Вводные сведения о Xcode и Конструкторе интерфейсов.
Например, давайте перетащите панель инструментов из инспектора библиотеки в окно редактора интерфейса:

Затем перетащите в текстовое представление и разместите его, чтобы заполнить область под панелью инструментов:

Так как мы хотим, чтобы текстовое представление сжималось и росло по мере изменения размера окна, давайте переключимся в редактор ограничений и добавим следующие ограничения:

Щелкнув четыре красных луча в верхней части редактора и нажав кнопку Добавить 4 ограничения, мы указываем текстовому представлению придерживаться заданных координат X,Y и увеличиваться или уменьшаться по горизонтали и вертикали по мере изменения размера окна.
Наконец, предоставьте текстовое представление для кода с помощью розетки ViewController.h (обязательно выберите файл):

Сохраните изменения и переключитесь обратно на Visual Studio для Mac для синхронизации с Xcode.
Дополнительные сведения о работе с точками идействиями см. в документации по выходу и действию .
Стандартный рабочий процесс окна
Для любого окна, с которым вы работаете и с которым вы работаете в приложении Xamarin.Mac, процесс в основном совпадает с тем, что мы только что сделали выше:
- Для новых окон, которые не добавляются автоматически в проект, добавьте в проект новое определение окна. Это будет подробно рассмотрено ниже.
- Дважды щелкните файл, Main.storyboard чтобы открыть макет окна для редактирования в конструкторе интерфейсов Xcode.
- Перетащите новое окно в макет пользовательского интерфейса и подключите его к главному окну с помощью segues (дополнительные сведения см. в разделе Segues нашей документации по работе с раскадровки ).
- Задайте все необходимые свойства окна в инспекторе атрибутов и инспекторе размера.
- Перетащите элементы управления, необходимые для создания интерфейса, и настройте их в инспекторе атрибутов.
- Используйте инспектор размера для обработки изменения размера элементов пользовательского интерфейса.
- Предоставление элементов пользовательского интерфейса окна в коде C# с помощью торговых точек и действий.
- Сохраните изменения и переключитесь обратно на Visual Studio для Mac для синхронизации с Xcode.
Теперь, когда у нас есть базовое окно, мы рассмотрим типичные процессы, выполняемые приложением Xamarin.Mac при работе с окнами.
Отображение окна по умолчанию
По умолчанию новое приложение Xamarin.Mac автоматически отображает окно, определенное MainWindow.xib в файле при запуске:

Так как мы изменили структуру этого окна выше, оно теперь включает панель инструментов по умолчанию и элемент управления «Текстовый режим «. За отображение этого окна отвечает следующий раздел Info.plist файла:

Раскрывающийся список Основной интерфейс используется для выбора раскадровки, которая будет использоваться в качестве main пользовательского интерфейса приложения (в данном случае Main.storyboard ).
Контроллер представления автоматически добавляется в проект для управления отображаемым главным окном (вместе с основным представлением). Он определяется в ViewController.cs файле и присоединяется к владельцу файла в конструкторе интерфейсов в инспекторе удостоверений:

Для нашего окна мы хотели бы иметь заголовок при первом открытии untitled , поэтому давайте переопределим ViewWillAppear метод в , ViewController.cs чтобы он выглядел следующим образом:
public override void ViewWillAppear () < base.ViewWillAppear (); // Set Window Title this.View.Window.Title = "untitled"; >
Свойство окна Title задается в методе ViewWillAppear , а не в методе ViewDidLoad , так как представление может быть загружено в память, оно еще не полностью создано. При обращении к свойству Title в методе ViewDidLoad мы получим null исключение, так как окно еще не создано и не подключено к свойству .
Программное закрытие окна
В некоторых случаях окно в приложении Xamarin.Mac может потребоваться закрыть программным способом, кроме нажатия пользователем кнопки Закрыть окна или использования пункта меню. MacOS предоставляет два разных способа программного NSWindow закрытия: PerformClose и Close .
PerformClose
PerformClose Вызов метода NSWindow объекта имитирует нажатие пользователем кнопки Закрыть окна, на мгновение выделяя кнопку и закрывая окно.
Если приложение реализует NSWindow событие , WillClose оно будет вызываться перед закрытием окна. Если событие возвращает false , окно не будет закрыто. Если окно не имеет кнопки Закрыть или не может быть закрыто по какой-либо причине, ОС издаст звуковой сигнал оповещения.
MyWindow.PerformClose(this);
Будет пытаться закрыть MyWindow NSWindow экземпляр . В случае успешного выполнения окно будет закрыто, в противном случае будет издаваться звуковой сигнал оповещения и останется открытым.
Закрыть
Close Вызов метода NSWindow не имитирует нажатие пользователем кнопки Закрыть окна путем мгновенного выделения кнопки, а просто закрывает окно.
Окно не обязательно должно быть видимым, чтобы его закрыть, и уведомление NSWindowWillCloseNotification будет опубликовано в центре уведомлений по умолчанию для закрытия окна.
Метод Close отличается от метода двумя важными PerformClose способами:
- Он не пытается вызвать WillClose событие.
- Он не имитирует нажатие пользователем кнопки Закрыть путем мгновенного выделения кнопки.
MyWindow.Close();
Будет закрывать MyWindow NSWindow экземпляр .
Измененное содержимое windows
В macOS компания Apple предоставила способ информирования пользователя о том, что содержимое окна ( NSWindow ) было изменено пользователем и нуждается в сохранении. Если окно содержит измененное содержимое, в мини-приложении Close будет отображаться небольшая черная точка:

Если пользователь пытается закрыть окно или выйти из приложения Mac во время несохраненных изменений в содержимом Окна, необходимо отобразить диалоговое окно или модальный лист и разрешить пользователю сначала сохранить свои изменения:

Пометка окна как измененного
Чтобы пометить окно как измененное содержимое, используйте следующий код:
// Mark Window content as modified Window.DocumentEdited = true;
После сохранения изменений снимите измененный флаг с помощью:
// Mark Window content as not modified Window.DocumentEdited = false;
Сохранение изменений перед закрытием окна
Чтобы watch для пользователя, закрывающего окно и позволяя ему сохранять измененное содержимое заранее, необходимо создать подкласс NSWindowDelegate и переопределить его WindowShouldClose метод. Пример:
using System; using AppKit; using System.IO; using Foundation; namespace SourceWriter < public class EditorWindowDelegate : NSWindowDelegate < #region Computed Properties public NSWindow Window < get; set;>#endregion #region constructors public EditorWindowDelegate (NSWindow window) < // Initialize this.Window = window; >#endregion #region Override Methods public override bool WindowShouldClose (Foundation.NSObject sender) < // is the window dirty? if (Window.DocumentEdited) < var alert = new NSAlert () < AlertStyle = NSAlertStyle.Critical, InformativeText = "Save changes to document before closing window?", MessageText = "Save Document", >; alert.AddButton ("Save"); alert.AddButton ("Lose Changes"); alert.AddButton ("Cancel"); var result = alert.RunSheetModal (Window); // Take action based on result switch (result) < case 1000: // Grab controller var viewController = Window.ContentViewController as ViewController; // Already saved? if (Window.RepresentedUrl != null) < var path = Window.RepresentedUrl.Path; // Save changes to file File.WriteAllText (path, viewController.Text); return true; >else < var dlg = new NSSavePanel (); dlg.Title = "Save Document"; dlg.BeginSheet (Window, (rslt) => < // File selected? if (rslt == 1) < var path = dlg.Url.Path; File.WriteAllText (path, viewController.Text); Window.DocumentEdited = false; viewController.View.Window.SetTitleWithRepresentedFilename (Path.GetFileName(path)); viewController.View.Window.RepresentedUrl = dlg.Url; Window.Close(); >>); return true; > return false; case 1001: // Lose Changes return true; case 1002: // Cancel return false; > > return true; > #endregion > >
Используйте следующий код, чтобы присоединить экземпляр этого делегата к окну:
// Set delegate Window.Delegate = new EditorWindowDelegate(Window);
Сохранение изменений перед закрытием приложения
Наконец, приложение Xamarin.Mac должно проверка, чтобы узнать, содержит ли какая-либо из его Windows измененное содержимое, и позволить пользователю сохранить изменения перед выходом. Для этого измените AppDelegate.cs файл, переопределите ApplicationShouldTerminate метод и сделайте его следующим образом:
public override NSApplicationTerminateReply ApplicationShouldTerminate (NSApplication sender) < // See if any window needs to be saved first foreach (NSWindow window in NSApplication.SharedApplication.Windows) < if (window.Delegate != null && !window.Delegate.WindowShouldClose (this)) < // Did the window terminate the close? return NSApplicationTerminateReply.Cancel; >> // Allow normal termination return NSApplicationTerminateReply.Now; >
Работа с несколькими окнами
Большинство приложений Mac на основе документов могут редактировать несколько документов одновременно. Например, в текстовом редакторе может быть открыто несколько текстовых файлов для редактирования одновременно. По умолчанию в новом приложении Xamarin.Mac есть меню «Файл » с элементом «Создать «, автоматически подключенным к newDocument: действию.
Приведенный ниже код активирует этот новый элемент и позволит пользователю открыть несколько копий главного окна для одновременного редактирования нескольких документов.
Измените AppDelegate.cs файл и добавьте следующее вычисляемое свойство:
public int UntitledWindowCount < get; set;>=1;
Используйте его для отслеживания количества несохраненных файлов, чтобы мы могли оставить отзыв пользователю (в соответствии с рекомендациями Apple, как описано выше).
Затем добавьте следующий метод:
[Export ("newDocument:")] void NewDocument (NSObject sender) < // Get new window var storyboard = NSStoryboard.FromName ("Main", null); var controller = storyboard.InstantiateControllerWithIdentifier ("MainWindow") as NSWindowController; // Display controller.ShowWindow(this); // Set the title controller.Window.Title = (++UntitledWindowCount == 1) ? "untitled" : string.Format ("untitled ", UntitledWindowCount); >
Этот код создает новую версию оконного контроллера, загружает новое окно, делает его основными и ключевыми окнами и задает его заголовок. Теперь, если мы запустите приложение и выберите Создать в меню Файл , откроется новое окно редактора:

Если открыть меню Windows , вы увидите, что приложение автоматически отслеживает и обрабатывает наши открытые окна:

Дополнительные сведения о работе с меню в приложении Xamarin.Mac см. в документации по работе с меню .
Получение активного окна
В приложении Xamarin.Mac, которое может открывать несколько окон (документов), иногда требуется получить текущее верхнее окно (ключевое окно). Следующий код возвращает окно ключей:
var window = NSApplication.SharedApplication.KeyWindow;
Его можно вызвать в любом классе или методе, которому требуется доступ к текущему ключевому окну. Если в настоящее время окно не открыто, возвращается null .
Доступ ко всем окнам приложений
В некоторых случаях может потребоваться доступ ко всем окнам, открытым в приложении Xamarin.Mac. Например, чтобы узнать, открыт ли файл, который пользователь хочет открыть, в окне выхода.
объект NSApplication.SharedApplication поддерживает Windows свойство , содержащее массив всех открытых окон в приложении. Вы можете выполнить итерацию по этому массиву, чтобы получить доступ ко всем текущим окнам приложения. Пример:
// Is the file already open? for(int n=0; n >
В примере кода мы приведение каждого возвращаемого окна к пользовательскому ViewController классу в нашем приложении и проверяем значение настраиваемого Path свойства по пути к файлу, который пользователь хочет открыть. Если файл уже открыт, мы переносим это окно на передний план.
Настройка размера окна в коде
Бывают случаи, когда приложению требуется изменить размер окна в коде. Чтобы изменить размер окна и его положение, необходимо настроить его Frame свойство . При настройке размера окна, как правило, необходимо также настроить его источник, чтобы сохранить окно в том же месте из-за системы координат macOS.
В отличие от iOS, где левый верхний угол представляет (0,0), в macOS используется математическая система координат, где левый нижний угол экрана представляет (0,0). В iOS координаты увеличиваются по мере перемещения вниз вправо. В macOS координаты увеличиваются в значении вверх справа.
В следующем примере кода изменяется размер окна:
nfloat y = 0; // Calculate new origin y = Frame.Y - (768 - Frame.Height); // Resize and position window CGRect frame = new CGRect (Frame.X, y, 1024, 768); SetFrame (frame, true);
При настройке размера и расположения окон в коде необходимо обеспечить соблюдение минимальных и максимальных размеров, установленных в Конструкторе интерфейсов. Это не будет автоматически соблюдаться, и вы сможете сделать окно больше или меньше этих ограничений.
Изменения размера окна мониторинга
Иногда может потребоваться отслеживать изменения размера окна в приложении Xamarin.Mac. Например, чтобы перерисовать содержимое в соответствии с новым размером.
Чтобы отслеживать изменения размера, сначала убедитесь, что вы назначили пользовательский класс для контроллера окна в конструкторе интерфейсов Xcode. Например, MasterWindowController в следующем примере:

Затем измените пользовательский класс Window Controller и отслеживайте DidResize событие в окне контроллера, чтобы получать уведомления об изменениях размера в реальном времени. Пример:
public override void WindowDidLoad () < base.WindowDidLoad (); Window.DidResize += (sender, e) =>< // Do something as the window is being live resized >; >
При необходимости можно использовать DidEndLiveResize событие , чтобы получать уведомления только после того, как пользователь завершит изменение размера окна. Пример:
public override void WindowDidLoad () < base.WindowDidLoad (); Window.DidEndLiveResize += (sender, e) =>< // Do something after the user's finished resizing // the window >; >
Задание заголовка окна и представленного файла
При работе с окнами, представляющими документы, имеет DocumentEdited свойство , которое, если задано true значение , NSWindow отображает небольшую точку на кнопке Закрыть, чтобы предоставить пользователю указание на то, что файл был изменен и должен быть сохранен перед закрытием.
Давайте отредактируем наш ViewController.cs файл и внесите следующие изменения:
public bool DocumentEdited < get < return View.Window.DocumentEdited; >set < View.Window.DocumentEdited = value; >> . public override void ViewWillAppear () < base.ViewWillAppear (); // Set Window Title this.View.Window.Title = "untitled"; View.Window.WillClose += (sender, e) =>< // is the window dirty? if (DocumentEdited) < var alert = new NSAlert () < AlertStyle = NSAlertStyle.Critical, InformativeText = "We need to give the user the ability to save the document here. ", MessageText = "Save Document", >; alert.RunModal (); > >; > public override void AwakeFromNib () < base.AwakeFromNib (); // Show when the document is edited DocumentEditor.TextDidChange += (sender, e) =>< // Mark the document as dirty DocumentEdited = true; >; // Overriding this delegate is required to monitor the TextDidChange event DocumentEditor.ShouldChangeTextInRanges += (NSTextView view, NSValue[] values, string[] replacements) => < return true; >; >
Мы также отслеживаем WillClose событие в окне и проверяем состояние DocumentEdited свойства . Если это так, true необходимо предоставить пользователю возможность сохранить изменения в файле. Если мы запустим приложение и введем текст, появится точка:

Если вы попытаетесь закрыть окно, вы получите оповещение:

При загрузке документа из файла задайте для имени окна имя файла с помощью window.SetTitleWithRepresentedFilename (Path.GetFileName(path)); метода (учитывая, что path это строка, представляющая открываемый файл). Кроме того, можно задать URL-адрес файла с помощью window.RepresentedUrl = url; метода .
Если URL-адрес указывает на тип файла, известный операционной системе, его значок будет отображаться в строке заголовка. Если пользователь щелкнет значок правой кнопкой мыши, отобразится путь к файлу.
Измените AppDelegate.cs файл и добавьте следующий метод:
[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) < var path = url.Path; // 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.View.Window.SetTitleWithRepresentedFilename (Path.GetFileName(path)); viewController.View.Window.RepresentedUrl = url; >> >
Теперь, если мы запустите приложение, выберите Открыть. в меню Файл , выберите текстовый файл в диалоговом окне Открыть и откройте его:

Отобразится файл, а заголовок будет установлен со значком файла:

Добавление нового окна в проект
Помимо main окна документа, приложению Xamarin.Mac может потребоваться отображать другие типы окон для пользователя, например Параметры или Панели инспектора.
Чтобы добавить новое окно, сделайте следующее:
- В Обозреватель решений дважды щелкните Main.storyboard файл, чтобы открыть его для редактирования в конструкторе интерфейсов Xcode.
- Перетащите новый контроллер окна из библиотеки и перетащите его в область конструктора:

- В разделе Identity Inspector (Инспектор удостоверений) введите PreferencesWindow идентификатор раскадровки:

- Проектирование интерфейса:

- Откройте меню приложения ( MacWindows ), выберите Параметры. , Control-Click и перетащите в новое окно:

- Выберите Показать во всплывающем меню.
- Сохраните изменения и вернитесь в Visual Studio для Mac для синхронизации с Xcode.
Если мы запустите код и выберите Параметры. в меню приложения, откроется окно:

Работа с панелями
Как указано в начале этой статьи, панель плавает над другими окнами и предоставляет средства или элементы управления, с которыми пользователи могут работать при открытии документов.
Как и любой другой тип окна, с которым вы работаете в приложении Xamarin.Mac, процесс в основном такой же:
- Добавьте новое определение окна в проект.
- Дважды щелкните файл, .xib чтобы открыть макет окна для редактирования в конструкторе интерфейсов Xcode.
- Задайте все необходимые свойства окна в инспекторе атрибутов и инспекторе размера.
- Перетащите элементы управления, необходимые для создания интерфейса, и настройте их в инспекторе атрибутов.
- Используйте инспектор размера для обработки изменения размера элементов пользовательского интерфейса.
- Предоставление элементов пользовательского интерфейса окна в коде C# с помощью торговых точек и действий.
- Сохраните изменения и переключитесь обратно на Visual Studio для Mac для синхронизации с Xcode.
В инспекторе атрибутов доступны следующие параметры, относящиеся к панелям:

- Стиль — позволяет настраивать стиль панели из: Обычная панель (выглядит как стандартное окно), Служебная панель (имеет меньшую строку заголовка), Панель HUD (является полупрозрачной, а заголовок окна является частью фона).
- Без активации — определяет, на панели становится ключевым окном.
- Модальный документ . Если документ модальный, панель будет плавать только над окнами приложения, в противном случае она будет плавать выше всех.
Чтобы добавить новую панель, сделайте следующее:
- В Обозреватель решений щелкните правой кнопкой мыши проект и выберите Добавить>новый файл. .
- В диалоговом окне Новый файл выберите Окно Cocoa Xamarin.Mac>с контроллером:

- Введите в поле Имя значение DocumentPanel и нажмите кнопку Новый.
- Дважды щелкните файл, DocumentPanel.xib чтобы открыть его для редактирования в Конструкторе интерфейсов:

- Удалите существующее окно и перетащите панель из инспектора библиотеки в редакторе интерфейсов:

- Подключите панель квыходуокна — Владельца — файла:

- Переключитесь в инспектор удостоверений и задайте классу Panel значение DocumentPanel :

- Сохраните изменения и вернитесь в Visual Studio для Mac для синхронизации с Xcode.
- Измените DocumentPanel.cs файл и измените определение класса следующим образом: public partial class DocumentPanel : NSPanel
- Сохраните изменения в файле.
Измените AppDelegate.cs файл и сделайте DidFinishLaunching метод следующим:
public override void DidFinishLaunching (NSNotification notification) < // Display panel var panel = new DocumentPanelController (); panel.Window.MakeKeyAndOrderFront (this); >
Если мы запустим наше приложение, отобразится панель:

Панели Windows устарели в Apple и должны быть заменены на Inspector Interfaces. Полный пример создания инспектора в приложении Xamarin.Mac см. в нашем примере приложения MacInspector .
Итоги
В этой статье подробно рассматривается работа с Windows и Панелями в приложении Xamarin.Mac. Мы узнали о различных типах и использовании Windows и Panels, о том, как создавать и обслуживать Windows и Панели в конструкторе интерфейсов Xcode, а также как работать с Windows и Панелями в коде C#.
Связанные ссылки
- MacWindows (пример)
- MacInspector (пример)
- Привет, Mac
- Работа с меню
- Темы оформления macOS (Apple)
- Windows, панели и экраны (Apple)