Aracılığıyla paylaş


Xamarin.Mac'te Windows

Bu makale, Xamarin.Mac uygulamasında windows ve panellerle çalışmayı kapsar. Xcode ve Interface Builder'da pencere ve paneller oluşturmayı, bunları görsel taslaklardan ve .xib dosyalarından yüklemeyi ve program aracılığıyla bunlarla çalışmayı açıklar.

Xamarin.Mac uygulamasında C# ve .NET ile çalışırken, ve Xcode'da Objective-C çalışan bir geliştiricinin sahip olduğu Windows ve Panellere erişebilirsiniz. Xamarin.Mac doğrudan Xcode ile tümleştirildiği için, Windows ve Panellerinizi oluşturmak ve bakımını yapmak için Xcode'un Arabirim Oluşturucusu'nu kullanabilirsiniz (veya isteğe bağlı olarak bunları doğrudan C# kodunda oluşturabilirsiniz).

Amacına bağlı olarak, bir Xamarin.Mac uygulaması ekranda görüntülenen ve çalıştığı bilgileri yönetmek ve koordine etmek için bir veya daha fazla Windows sunabilir. Pencerenin asıl işlevleri şunlardır:

  1. Görünümler ve Denetimlerin yerleştirilebileceği ve yönetilebileceği bir alan sağlamak için.
  2. Hem klavye hem de fare ile kullanıcı etkileşimine yanıt olarak olayları kabul etmek ve yanıtlamak için.

Windows, Modeless durumunda (aynı anda birden çok belge açabilen bir metin düzenleyicisi gibi) veya Kalıcı (uygulama devam etmeden önce kapatılması gereken dışarı aktarma iletişim kutusu gibi) kullanılabilir.

Paneller, genellikle metin biçimi denetçileri ve sistem Renk Seçici gibi yardımcı pencereler gibi bir uygulamada yardımcı işlev sunan özel bir Pencere türüdür (temel NSWindow sınıfın alt sınıfı).

Xcode'da bir pencereyi düzenleme

Bu makalede, Xamarin.Mac uygulamasında Windows ve Panellerle çalışmanın temellerini ele alacağız. Bu makalede kullanacağımız temel kavramları ve teknikleri kapsarken öncelikle Hello, Mac makalesi, özellikle Xcode ve Interface Builder'a Giriş ve Çıkışlar ve Eylemler bölümleriyle çalışmanız önemle önerilir.

Xamarin.Mac Internals belgesinin C# sınıflarını / yöntemlerini kullanıma alma Objective-Cbölümüne de göz atmak isteyebilirsiniz. Bu belge, C# sınıflarınızı nesnelere ve UI Öğelerine Objective-C bağlamada kullanılan ve Export komutlarını açıklar.Register

Pencerelere giriş

Yukarıda belirtildiği gibi Bir Pencere, Görünümler ve Denetimlerin yerleştirilip yönetilebildiği ve kullanıcı etkileşimi temelinde olaylara yanıt verebildiği (klavye veya fare aracılığıyla) bir alan sağlar.

Apple'a göre, bir macOS Uygulamasında beş ana Windows türü vardır:

  • Belge Penceresi - Belge penceresi, elektronik tablo veya metin belgesi gibi dosya tabanlı kullanıcı verileri içerir.
  • Uygulama Penceresi - Uygulama penceresi, belge tabanlı olmayan bir uygulamanın ana penceresidir (Mac'te Takvim uygulaması gibi).
  • Panel - Panel diğer pencerelerin üzerinde kayar ve belgeler açıkken kullanıcıların çalışabileceği araçlar veya denetimler sağlar. Bazı durumlarda panel yarı saydam olabilir (örneğin, büyük grafiklerle çalışırken).
  • İletişim kutusu - Bir kullanıcı eylemine yanıt olarak bir iletişim kutusu görüntülenir ve genellikle kullanıcıların eylemi tamamlayabilmesi için yollar sağlar. İletişim kutusu kapatılmadan önce kullanıcının yanıtını gerektirir. (Bkz. İletişim Kutularıyla Çalışma)
  • Uyarılar - Uyarı, ciddi bir sorun oluştuğunda (hata gibi) veya uyarı olarak (bir dosyayı silmeye hazırlanma gibi) görüntülenen özel bir iletişim kutusu türüdür. Bir uyarı bir iletişim kutusu olduğundan, kapatılmadan önce bir kullanıcı yanıtı da gerektirir. (Bkz. Uyarılarla Çalışma)

Daha fazla bilgi için Apple'ın macOS tasarım temalarının Windows Hakkında bölümüne bakın.

Ana, anahtar ve etkin olmayan pencereler

Xamarin.Mac uygulamasındaki Windows, kullanıcının şu anda onlarla nasıl etkileşimde bulunduğuna bağlı olarak farklı görünebilir ve farklı davranabilir. Şu anda kullanıcının dikkatini çeken en önemli Belge veya Uygulama Penceresi Ana Pencere olarak adlandırılır. Çoğu durumda bu Pencere aynı zamanda Anahtar Penceresi (şu anda kullanıcı girişini kabul eden pencere) olacaktır. Ancak bu durum her zaman geçerli değildir; örneğin, bir Renk Seçici açık olabilir ve kullanıcının Belge Penceresindeki bir öğenin durumunu değiştirmek için etkileşimde bulunduğu Anahtar penceresi olabilir (yine de Ana Pencere olabilir).

Ana ve Anahtar Pencereler (ayrıysa) her zaman etkindir, Etkin Olmayan Windows ön planda olmayan açık pencerelerdir. Örneğin, bir metin düzenleyicisi uygulamasında aynı anda birden fazla belge açık olabilir, yalnızca Ana Pencere etkin, diğer tüm belgeler etkin olmayabilir.

Daha fazla bilgi için Apple'ın macOS tasarım temalarının Windows Hakkında bölümüne bakın.

Adlandırma pencereleri

Pencere bir Başlık Çubuğu görüntüleyebilir ve Başlık görüntülendiğinde genellikle uygulamanın adı, üzerinde çalışılan belgenin adı veya pencerenin işlevi (Denetçi gibi) olur. Bazı uygulamalar, görüntüye göre tanınabilir olduklarından ve belgelerle çalışmadığından Başlık Çubuğu görüntülemez.

Apple aşağıdaki yönergeleri önerir:

  • Ana, belge dışı bir pencerenin başlığı için uygulama adınızı kullanın.
  • Yeni bir belge penceresi adlandır.untitled İlk yeni belge için, Başlığa bir sayı eklemeyin (örneğin untitled 1). Kullanıcı ilkini kaydetmeden ve titlemeden önce başka bir yeni belge oluşturursa, bu pencereyi untitled 2, untitled 3vb. çağırın.

Daha fazla bilgi için Apple'ın macOS tasarım temalarının Windows Adlandırma bölümüne bakın.

Tam ekran pencereler

macOS'ta bir uygulamanın penceresi, içeriğiyle dikkat dağıtıcı olmayan etkileşim sağlamak için Uygulama Menü Çubuğu (imleci ekranın en üstüne taşıyarak gösterilebilir) dahil olmak üzere her şeyi tam ekran gizleyerek ilerleyebilir.

Apple aşağıdaki yönergeleri önerir:

  • Bir pencerenin tam ekrana gitmesinin mantıklı olup olmadığını belirleyin. Kısa etkileşimler (hesap makinesi gibi) sağlayan uygulamalar tam ekran modu sağlamamalıdır.
  • Tam ekran görevi gerektiriyorsa araç çubuğunu gösterin. Araç çubuğu genellikle tam ekran modundayken gizlenir.
  • Tam ekran penceresinde kullanıcıların görevi tamamlamak için ihtiyaç duyduğu tüm özellikler olmalıdır.
  • Mümkünse, kullanıcı tam ekran penceresindeyken Bulucu etkileşimini önleyin.
  • Odağı ana görevden uzaklaştırmadan artan ekran alanından yararlanın.

Daha fazla bilgi için Apple'ın macOS tasarım temalarının Tam Ekran Windows bölümüne bakın.

Panel

Panel, etkin belgeyi veya seçimi etkileyen denetimleri ve seçenekleri (sistem Renk Seçicisi gibi) içeren yardımcı bir penceredir:

Renk paneli

Paneller Uygulamaya Özgü veya Sistem Genelinde olabilir. Uygulamaya Özgü Paneller uygulamanın belge pencerelerinin üst kısmında kayar ve uygulama arka plandayken kaybolur. Sistem Genelindeki Paneller (Yazı Tipleri paneli gibi), uygulama ne olursa olsun tüm açık pencerelerin üzerine kayar.

Apple aşağıdaki yönergeleri önerir:

  • Genel olarak, standart bir panel kullanın, şeffaf paneller yalnızca dikkatli ve grafik yoğunluklu görevler için kullanılmalıdır.
  • Kullanıcılara görevlerini doğrudan etkileyen önemli denetimlere veya bilgilere kolay erişim sağlamak için bir panel kullanmayı göz önünde bulundurun.
  • Panelleri gerektiği gibi gizleyin ve gösterin.
  • Paneller her zaman başlık çubuğu içermelidir.
  • Paneller etkin bir simge durumuna küçült düğmesi içermemelidir.

Müfettiş

Çoğu modern macOS uygulaması, Panel Windows kullanmak yerine, etkin belgeyi veya seçimi etkileyen yardımcı denetimleri ve seçenekleri Ana Pencerenin parçası olan Denetçiler olarak sunar (aşağıda gösterilen Sayfalar uygulaması gibi):

Örnek bir denetçi

Daha fazla bilgi için Apple'ın macOS tasarım temalarının Paneller bölümüne bakın.

Xcode'da pencere oluşturma ve koruma

Yeni bir Xamarin.Mac Cocoa uygulaması oluşturduğunuzda varsayılan olarak standart bir boş pencere alırsınız. Bu pencereler, projeye otomatik olarak eklenen bir .storyboard dosyada tanımlanır. Windows tasarımınızı düzenlemek için, Çözüm Gezgini dosyaya Main.storyboard çift tıklayın:

Ana görsel taslak seçme

Bu, Xcode'un Arabirim Oluşturucusu'nda pencere tasarımını açar:

Xcode'da kullanıcı arabirimini düzenleme

Öznitelik Denetçisi'nde, pencerenizi tanımlamak ve denetlemek için kullanabileceğiniz birkaç özellik vardır:

  • Başlık - Bu, pencerenin başlık çubuğunda görüntülenecek metindir.
  • Otomatik Kaydetme - Konum ve ayarlar otomatik olarak kaydedildiğinde pencereyi tanımlamak için kullanılacak anahtardır .
  • Başlık Çubuğu - Pencerede başlık çubuğu görüntüleniyor mu?
  • Birleşik Başlık ve Araç Çubuğu - Pencere bir Araç Çubuğu içeriyorsa, başlık çubuğunun bir parçası olmalıdır.
  • Tam Boyutlu İçerik Görünümü - Pencerenin içerik alanının Başlık çubuğunun altında olmasını sağlar.
  • Gölge - Pencerenin gölgesi var mı?
  • Dokulu - Dokulu pencereler efektler (canlılık gibi) kullanabilir ve vücutlarında herhangi bir yere sürüklenerek taşınabilir.
  • Kapat - Pencerenin kapat düğmesi var mı?
  • Simge Durumuna Küçült - Pencerede simge durumuna küçült düğmesi var mı?
  • Yeniden boyutlandır - Pencerenin yeniden boyutlandırma denetimi var mı?
  • Araç Çubuğu Düğmesi - Pencerede araç çubuğunu gizle/göster düğmesi var mı?
  • Geri yüklenebilir - Pencerenin konumu ve ayarları otomatik olarak kaydedilir ve geri yüklenir.
  • Başlatmada Görünür - Dosya yüklendiğinde pencere otomatik olarak gösterilir .xib .
  • Devre Dışı Bırakıldığında Gizle - Uygulama arka plana girdiğinde pencere gizli mi?
  • Kapatıldığında Serbest Bırak - Pencere kapatıldığında bellekten temizlenir mi?
  • Araç İpuçlarını Her Zaman Görüntüle - Araç ipuçları sürekli görüntüleniyor mu?
  • Görünüm Döngüsünü Yeniden Hesaplar - Görünüm sırası, pencere çizilmeden önce yeniden hesaplanır mı?
  • Spaces, Exposé ve Cycling - Tümü, pencerenin bu macOS ortamlarında nasıl davranacağını tanımlar.
  • Tam Ekran - Bu pencerenin tam ekran moduna girip giremediğini belirler.
  • Animasyon - Pencere için kullanılabilen animasyon türünü denetler.
  • Görünüm - Pencerenin görünümünü denetler. Şimdilik tek bir görünüm var, Aqua.

Daha fazla ayrıntı için Apple'ın Windows ve NSWindow'a Giriş belgelerine bakın.

Varsayılan boyutu ve konumu ayarlama

Pencerenizin ilk konumunu ayarlamak ve boyutunu denetlemek için Boyut Denetçisi'ne geçin:

Varsayılan boyut ve konum

Buradan pencerenin başlangıç boyutunu ayarlayabilir, minimum ve maksimum boyut verebilir, ekrandaki ilk konumu ayarlayabilir ve pencerenin etrafındaki kenarlıkları denetleyebilirsiniz.

Özel bir ana pencere denetleyicisi ayarlama

Kullanıcı arabirimi öğelerini C# kodunda kullanıma sunan Çıkışlar ve Eylemler oluşturabilmek için Xamarin.Mac uygulamasının Özel Pencere Denetleyicisi kullanıyor olması gerekir.

Aşağıdakileri yapın:

  1. Xcode'un Arabirim Oluşturucusu'nda uygulamanın Görsel Taslak'ını açın.

  2. Tasarım Yüzeyi'nde öğesini NSWindowController seçin.

  3. Kimlik Denetçisi görünümüne geçin ve Sınıf Adı olarak girinWindowController:

    Sınıf adını ayarlama

  4. Değişikliklerinizi kaydedin ve eşitlemek için Mac için Visual Studio dönün.

  5. WindowController.cs Mac için Visual Studio'deki Çözüm Gezgini Project'inize bir dosya eklenir:

    Windows denetleyicisini seçme

  6. Xcode'un Arabirim Oluşturucusu'nda Görsel Taslak'ı yeniden açın.

  7. Dosya WindowController.h kullanılabilir olacaktır:

    WindowController.h dosyasını düzenleme

Kullanıcı arabirimi öğeleri ekleme

Bir pencerenin içeriğini tanımlamak için, denetimleri Kitaplık Denetçisi'nden Arabirim Düzenleyicisi'ne sürükleyin. Denetimleri oluşturmak ve etkinleştirmek için Arabirim Oluşturucusu'nu kullanma hakkında daha fazla bilgi için lütfen Xcode'a Giriş ve Arabirim Oluşturucusu belgelerimize bakın.

Örnek olarak, Bir Araç Çubuğunu Kitaplık Denetçisi'nden Arabirim Düzenleyicisi'ndeki pencereye sürükleyelim:

Kitaplıktan Araç Çubuğu Seçme

Ardından, Metin Görünümü'nü sürükleyin ve araç çubuğunun altındaki alanı dolduracak şekilde boyutlandırın:

Metin Görünümü Ekleme

Pencerenin boyutu değiştikçe Metin Görünümü'nü küçültmek ve büyütmek istediğimizden Kısıtlama Düzenleyicisi'ne geçip aşağıdaki kısıtlamaları ekleyelim:

Kısıtlamalar düzenleniyor

Düzenleyicinin üst kısmındaki dört Kırmızı I-Kirişi'ne ve 4 Kısıtlama Ekle'ye tıklayarak, metin görünümüne verilen X,Y koordinatlarına bağlı kalmalarını ve pencere yeniden boyutlandırıldıkçe yatay ve dikey olarak büyümesini veya küçülmesini söylüyoruz.

Son olarak, Metin Görünümü'nü çıkış kullanarak kodla kullanıma sunun (dosyayı seçtiğinizden ViewController.h emin olun):

Çıkış yapılandırma

Değişikliklerinizi kaydedin ve Xcode ile eşitlemek için Mac için Visual Studio geri dönün.

Çıkışlar ve Eylemler ile çalışma hakkında daha fazla bilgi için lütfen Outlet ve Action belgelerimize bakın.

Standart pencere iş akışı

Xamarin.Mac uygulamanızda oluşturduğunuz ve üzerinde çalıştığınız herhangi bir pencere için işlem temelde yukarıda yaptıklarımızla aynıdır:

  1. Projenize otomatik olarak eklenen varsayılan olmayan yeni pencereler için projeye yeni bir pencere tanımı ekleyin. Bu konu aşağıda ayrıntılı olarak ele alınacaktır.
  2. Xcode'un Main.storyboard Arabirim Oluşturucusu'nda düzenlemek üzere pencere tasarımını açmak için dosyaya çift tıklayın.
  3. Kullanıcı Arabirimi'nin tasarımına yeni bir Pencere sürükleyin ve Segues kullanarak pencereyi Ana Pencere'ye bağlar (daha fazla bilgi için Görsel Taslaklarla Çalışma belgelerimizin Segues bölümüne bakın).
  4. Öznitelik Denetçisi'nde ve Boyut Denetçisi'nde gerekli pencere özelliklerini ayarlayın.
  5. Arabiriminizi oluşturmak ve bunları Öznitelik Denetçisi'nde yapılandırmak için gereken denetimleri sürükleyin.
  6. Kullanıcı Arabirimi Öğeleriniz için yeniden boyutlandırmayı işlemek için Boyut Denetçisi'ni kullanın.
  7. Pencerenin kullanıcı arabirimi öğelerini Çıkışlar ve Eylemler aracılığıyla C# kodunda kullanıma sunma.
  8. Değişikliklerinizi kaydedin ve Xcode ile eşitlemek için Mac için Visual Studio geri dönün.

Artık temel bir pencere oluşturduğumuza göre, Xamarin.Mac uygulamasının windows ile çalışırken yaptığı tipik işlemlere göz atacağız.

Varsayılan pencereyi görüntüleme

Varsayılan olarak, yeni bir Xamarin.Mac uygulaması başlatıldığında dosyada MainWindow.xib tanımlanan pencereyi otomatik olarak görüntüler:

Çalışan örnek bir pencere

Yukarıdaki pencerenin tasarımını değiştirdiğimizden, artık varsayılan bir Araç Çubuğu ve Metin Görünümü denetimi içeriyor. Dosyadaki Info.plist aşağıdaki bölüm bu pencereyi görüntülemekle sorumludur:

Info.plist Dosyasını Düzenleme

Ana Arabirim açılan listesi, ana uygulama kullanıcı arabirimi olarak kullanılacak Görsel Taslak'ı seçmek için kullanılır (bu örnekteMain.storyboard).

Ana Windows'un (birincil Görünümüyle birlikte) görüntülenmesini denetlemek için projeye otomatik olarak bir Görünüm Denetleyicisi eklenir. Dosyada ViewController.cs tanımlanır ve Kimlik Denetçisi altında Arabirim Oluşturucusu'ndaki Dosyanın Sahibine eklenir:

Dosyanın sahibini ayarlama

Penceremiz için ilk açıldığında başlığının untitled olmasını istiyoruz, bu nedenle içindeki yöntemini ViewController.cs aşağıdaki gibi görünecek şekilde geçersiz kılalımViewWillAppear:

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

    // Set Window Title
    this.View.Window.Title = "untitled";
}

Not

Pencerenin Title özelliği yöntemi yerine ViewDidLoad yönteminde ViewWillAppear ayarlanır, çünkü görünüm belleğe yüklense de henüz tam olarak örneklenmez. yöntemindeki özelliğine Title ViewDidLoad erişirken, pencere henüz oluşturmadığından ve özelliğine kablolu olarak bağlanmadığından bir null özel durumla karşımıza çıkar.

Program aracılığıyla pencere kapatma

Xamarin.Mac uygulamasındaki bir pencereyi program aracılığıyla kapatmak istediğiniz zamanlar olabilir; bunun dışında, kullanıcının pencerenin Kapat düğmesine tıklamasını veya menü öğesini kullanmasını isteyebilirsiniz. macOS, program aracılığıyla kapatmak NSWindow için iki farklı yol sağlar: PerformClose ve Close.

PerformClose

PerformClose yöntemini NSWindow çağırmak, kullanıcının pencerenin Kapat düğmesine tıklayarak düğmeyi kısa süre vurgulayıp pencereyi kapatmasını simüle eder.

Uygulama 'nin WillClose olayını uygularsaNSWindow, pencere kapatılmadan önce tetiklenir. Olay döndürürse false, pencere kapatılmaz. Pencerede Kapat düğmesi yoksa veya herhangi bir nedenle kapatılamıyorsa, işletim sistemi uyarı sesini yayar.

Örneğin:

MyWindow.PerformClose(this);

Örneği kapatmaya MyWindow NSWindow çalışır. Başarılı olursa pencere kapatılır, aksi takdirde uyarı sesi yayılır ve açık kalır.

Kapat

yöntemini çağırmak Close NSWindow , pencerenin Kapat düğmesine tıklayan kullanıcının düğmeyi anlık olarak vurgulayarak benzetimini yapmaz, yalnızca pencereyi kapatır.

Bir pencerenin kapatılması için görünür olması gerekmez ve kapatılmakta olan pencere için varsayılan Bildirim Merkezi'ne bir NSWindowWillCloseNotification bildirim gönderilir.

yöntemi, Close yönteminden PerformClose iki önemli şekilde farklılık gösterir:

  1. Olayı tetiklemeye WillClose çalışmaz.
  2. Kapat düğmesine tıklayan kullanıcının anlık olarak düğmeyi vurgulayarak benzetimini yapmaz.

Örneğin:

MyWindow.Close();

Örneğin kapatılması MyWindow NSWindow gerekir.

Değiştirilen windows içeriği

MacOS'ta Apple, kullanıcıya bir Pencerenin (NSWindow) içeriğinin kullanıcı tarafından değiştirildiğini ve kaydedilmesi gerektiğini bildirmek için bir yol sağlamıştır. Pencere değiştirilmiş içerik içeriyorsa, pencere öğesinin Kapat pencere öğesinde küçük bir siyah nokta görüntülenir:

Değiştirilmiş işaretçi içeren bir pencere

Kullanıcı, Pencerenin içeriğinde kaydedilmemiş değişiklikler varken Windows'u kapatmaya veya Mac Uygulamasından çıkmayı denerse, bir İletişim Kutusu veya Kalıcı Sayfa sunmalı ve önce kullanıcının değişikliklerini kaydetmesine izin vermelisiniz:

Pencere kapatıldığında bir kaydetme sayfası gösteriliyor

Pencereyi değiştirilmiş olarak işaretleme

Bir Pencereyi değiştirilmiş içerik olarak işaretlemek için aşağıdaki kodu kullanın:

// Mark Window content as modified
Window.DocumentEdited = true;

Değişiklik kaydedildikten sonra aşağıdakini kullanarak değiştirilen bayrağı temizleyin:

// Mark Window content as not modified
Window.DocumentEdited = false;

Pencereyi kapatmadan önce değişiklikleri kaydetme

Kullanıcının bir Pencereyi kapatmasını ve değiştirilmiş içeriği önceden kaydetmesine izin vermek için, öğesinin NSWindowDelegate alt sınıfını WindowShouldClose oluşturmanız ve yöntemini geçersiz kılmanız gerekir. Örneğin:

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
    }
}

Pencereye bu temsilcinin bir örneğini eklemek için aşağıdaki kodu kullanın:

// Set delegate
Window.Delegate = new EditorWindowDelegate(Window);

Uygulamayı kapatmadan önce değişiklikleri kaydetme

Son olarak, Xamarin.Mac Uygulamanız Windows'un değiştirilmiş içerik içerip içermediğini denetlemeli ve kullanıcının çıkmadan önce değişiklikleri kaydetmesine izin vermelidir. Bunu yapmak için dosyanızı AppDelegate.cs düzenleyin, yöntemini geçersiz kılın ApplicationShouldTerminate ve aşağıdaki gibi görünmesini sağlayın:

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;
}

Birden çok pencereyle çalışma

Çoğu belge tabanlı Mac uygulaması aynı anda birden çok belgeyi düzenleyebilir. Örneğin, bir metin düzenleyicisinde aynı anda düzenleme için açık birden çok metin dosyası olabilir. Varsayılan olarak, yeni bir Xamarin.Mac uygulamasının Eylem'e otomatik olarak bağlı yeni öğe içeren bir Dosya menüsü vardır.newDocument:

Aşağıdaki kod bu yeni öğeyi etkinleştirir ve kullanıcının aynı anda birden çok belgeyi düzenlemek için Ana Pencere'nin birden çok kopyasını açmasına olanak tanır.

AppDelegate.cs Dosyayı düzenleyin ve aşağıdaki hesaplanan özelliği ekleyin:

public int UntitledWindowCount { get; set;} =1;

Kullanıcıya geri bildirimde bulunmak için kaydedilmemiş dosyaların sayısını izlemek için bunu kullanın (yukarıda açıklandığı gibi Apple'ın yönergelerine göre).

Ardından aşağıdaki yöntemi ekleyin:

[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 {0}", UntitledWindowCount);
}

Bu kod Pencere Denetleyicimizin yeni bir sürümünü oluşturur, yeni Pencereyi yükler, Ana ve Anahtar Penceresi yapar ve başlığı ayarlar. Şimdi uygulamamızı çalıştırır ve Dosya menüsünden Yeni'yi seçersek yeni bir düzenleyici penceresi açılır ve görüntülenir:

Yeni bir adsız pencere eklendi

Windows menüsünü açarsak uygulamanın açık pencerelerimizi otomatik olarak izlediğini ve işlediğini görebilirsiniz:

Pencereler menüsü

Xamarin.Mac uygulamasında Menülerle çalışma hakkında daha fazla bilgi için lütfen Menülerle Çalışma belgelerimize bakın.

Şu anda etkin olan pencereyi alma

Birden çok pencere (belge) açabilen bir Xamarin.Mac uygulamasında, en üstteki geçerli pencereyi (anahtar penceresi) almanız gereken zamanlar vardır. Aşağıdaki kod anahtar penceresini döndürür:

var window = NSApplication.SharedApplication.KeyWindow;

Geçerli anahtar penceresine erişmesi gereken herhangi bir sınıf veya yöntemde çağrılabilir. Açık bir pencere yoksa, döndürür null.

Tüm uygulama pencerelerine erişme

Xamarin.Mac uygulamanızın şu anda açık olduğu tüm pencerelere erişmeniz gereken zamanlar olabilir. Örneğin, kullanıcının açmak istediği bir dosyanın çıkış penceresinde zaten açık olup olmadığını görmek için.

, NSApplication.SharedApplication uygulamanızdaki tüm açık pencerelerden oluşan bir dizi içeren bir özellik tutar Windows . Uygulamanın geçerli pencerelerinin tümüne erişmek için bu diziyi yineleyebilirsiniz. Örneğin:

// 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;
    }
}

Örnek kodda, döndürülen her pencereyi uygulamamızdaki özel ViewController sınıfa atıyoruz ve özel Path özelliğin değerini kullanıcının açmak istediği dosya yolunda test ediyoruz. Dosya zaten açıksa bu pencereyi öne getiriyoruz.

Koddaki pencere boyutunu ayarlama

Uygulamanın koddaki bir pencereyi yeniden boyutlandırması gereken zamanlar vardır. Bir pencereyi yeniden boyutlandırmak ve yeniden konumlandırmak için, bu Frame pencerenin özelliğini ayarlarsınız. Pencerenin boyutunu ayarlarken, macOS'un koordinat sistemi nedeniyle pencereyi aynı konumda tutmak için pencerenin kaynağını da ayarlamanız gerekir.

Sol üst köşenin temsil ettiği iOS'un aksine (0,0), macOS ekranın sol alt köşesinin temsil ettiği bir matematik koordinat sistemi kullanır (0,0). iOS'ta sağa doğru aşağı doğru ilerlediğinizde koordinatlar artar. macOS'ta koordinatların değeri sağa doğru artar.

Aşağıdaki örnek kod bir pencereyi yeniden boyutlandırıyor:

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);

Önemli

Kodda bir pencere boyutunu ve konumunu ayarlarken, Arabirim Oluşturucusu'nda ayarladığınız en düşük ve en yüksek boyutlara dikkat ettiğinizden emin olmanız gerekir. Bu işlem otomatik olarak kabul edilmez ve pencereyi bu sınırlardan daha büyük veya daha küçük hale getirebilirsiniz.

İzleme penceresi boyutu değişiklikleri

Xamarin.Mac uygulamanızın içinde pencere boyutundaki değişiklikleri izlemeniz gereken zamanlar olabilir. Örneğin, içeriği yeni boyuta uyacak şekilde yeniden çizmek için.

Boyut değişikliklerini izlemek için, önce Xcode'un Arabirim Oluşturucusu'nda Pencere Denetleyicisi için özel bir sınıf atadığınızdan emin olun. Örneğin, MasterWindowController aşağıdakiler:

Kimlik Denetçisi

Ardından, özel Pencere Denetleyicisi sınıfını düzenleyin ve canlı boyut değişikliklerinin bildirilmesi için Denetleyicinin Penceresindeki olayı izleyin DidResize . Örneğin:

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

    Window.DidResize += (sender, e) => {
        // Do something as the window is being live resized
    };
}

İsteğe bağlı olarak, olayı yalnızca kullanıcı Pencere boyutunu değiştirmeyi bitirdikten sonra bildirim almak için kullanabilirsiniz DidEndLiveResize . Örneğin:

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

        Window.DidEndLiveResize += (sender, e) => {
        // Do something after the user's finished resizing
        // the window
    };
}

Pencerenin başlığını ve temsil edilen dosyayı ayarlama

Belgeleri temsil eden pencerelerle çalışırken, NSWindow DocumentEdited kapat düğmesinde küçük bir nokta görüntüleyip kullanıcıya dosyanın değiştirildiğini ve kapatmadan önce kaydedilmesi gerektiğini belirten bir özelliği true vardır.

Şimdi dosyamızı ViewController.cs düzenleyelim ve aşağıdaki değişiklikleri yapalım:

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;
    };

}

Ayrıca penceredeki WillClose olayı izliyor ve özelliğin DocumentEdited durumunu kontrol ediyoruz. Bu durumda true kullanıcıya değişiklikleri dosyaya kaydetme olanağı vermemiz gerekir. Uygulamamızı çalıştırır ve metin girersek nokta görüntülenir:

Değiştirilen pencere

Pencereyi kapatmaya çalışırsanız bir uyarı alırsınız:

Kaydetme iletişim kutusunu görüntüleme

Bir dosyadan belge yüklüyorsanız, yöntemini kullanarak window.SetTitleWithRepresentedFilename (Path.GetFileName(path)); pencerenin başlığını dosya adına ayarlayın (açılan dosyayı temsil eden bir dize olduğu path düşünüldüğünde). Ayrıca yöntemini kullanarak dosyanın URL'sini window.RepresentedUrl = url; ayarlayabilirsiniz.

URL, işletim sistemi tarafından bilinen bir dosya türüne işaret ediyorsa, başlık çubuğunda simgesi görüntülenir. Kullanıcı simgeye sağ tıklarsa dosyanın yolu gösterilir.

AppDelegate.cs Dosyayı düzenleyin ve aşağıdaki yöntemi ekleyin:

[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;

        }
    }
}

Şimdi uygulamamızı çalıştırırsak Dosya menüsünde Aç... öğesini seçin, İletişim Kutusunu Aç kutusundan bir metin dosyası seçin ve açın:

Açık bir iletişim kutusu

Dosya görüntülenir ve başlık dosyanın simgesiyle ayarlanır:

Yüklenen dosyanın içeriği

Projeye yeni pencere ekleme

Ana belge penceresinin yanı sıra, bir Xamarin.Mac uygulamasının kullanıcıya Tercihler veya Denetçi Panelleri gibi diğer pencere türlerini görüntülemesi gerekebilir.

Yeni bir pencere eklemek için aşağıdakileri yapın:

  1. Çözüm Gezgini, Xcode'un Arabirim Oluşturucusu'nda düzenlemek üzere açmak üzere dosyaya çift tıklayınMain.storyboard.

  2. Kitaplıktan yeni bir Pencere Denetleyicisini sürükleyip Tasarım Yüzeyi'ne bırakın:

    Kitaplıkta yeni bir Pencere Denetleyicisi seçme

  3. Kimlik Denetçisi'nde Görsel Taslak Kimliği için şunu girinPreferencesWindow:

    Görsel taslak kimliğini ayarlama

  4. Arabiriminizi tasarla:

    Kullanıcı arabirimini tasarlama

  5. Uygulama Menüsünü ()MacWindows açın, Tercihler..., Control tuşuna basıp tıklayıp yeni pencereye sürükleyin:

    Segue oluşturma

  6. Açılan menüden Göster'i seçin.

  7. Değişikliklerinizi kaydedin ve Xcode ile eşitlemek için Mac için Visual Studio dönün.

Kodu çalıştırır ve Uygulama Menüsünden Tercihler... öğesini seçersek, pencere görüntülenir:

Örnek tercihler menüsü

Panellerle çalışma

Bu makalenin başında belirtildiği gibi, bir panel diğer pencerelerin üzerinde kayar ve belgeler açıkken kullanıcıların çalışabileceği araçlar veya denetimler sağlar.

Xamarin.Mac uygulamanızda oluşturduğunuz ve çalıştığınız diğer pencere türleri gibi işlem de temelde aynıdır:

  1. Projeye yeni bir pencere tanımı ekleyin.
  2. Xcode'un .xib Arabirim Oluşturucusu'nda düzenlemek üzere pencere tasarımını açmak için dosyaya çift tıklayın.
  3. Öznitelik Denetçisi'nde ve Boyut Denetçisi'nde gerekli pencere özelliklerini ayarlayın.
  4. Arabiriminizi oluşturmak ve bunları Öznitelik Denetçisi'nde yapılandırmak için gereken denetimleri sürükleyin.
  5. Kullanıcı Arabirimi Öğeleriniz için yeniden boyutlandırmayı işlemek için Boyut Denetçisi'ni kullanın.
  6. Pencerenin kullanıcı arabirimi öğelerini Çıkışlar ve Eylemler aracılığıyla C# kodunda kullanıma sunma.
  7. Değişikliklerinizi kaydedin ve Xcode ile eşitlemek için Mac için Visual Studio geri dönün.

Öznitelik Denetçisi'nde Panellere özgü aşağıdaki seçenekleriniz vardır:

Öznitelik Denetçisi

  • Stil - Panelin stilini şu şekilde ayarlamanıza izin verir: Normal Panel (standart bir pencereye benzer), Yardımcı Program Paneli (daha küçük bir Başlık çubuğuna sahiptir), HUD Paneli (yarı saydamdır ve başlık çubuğu arka planda yer alır).
  • Etkinleştirilmedi - Paneldeki belirler, anahtar pencere olur.
  • Belge Kalıcı - Belge Kalıcı ise panel yalnızca uygulamanın pencerelerinin üzerinde kayar, aksi takdirde her şeyden önce kayar.

Yeni bir Panel eklemek için aşağıdakileri yapın:

  1. Çözüm Gezgini Proje'ye sağ tıklayın ve Yeni Dosya Ekle...'yi>seçin.

  2. Yeni Dosya iletişim kutusunda Denetleyicili Xamarin.Mac>Cocoa Penceresi'ni seçin:

    Yeni pencere denetleyicisi ekleme

  3. Ad için girin DocumentPanel ve Yeni düğmesine tıklayın.

  4. Arabirim Oluşturucusu'nda DocumentPanel.xib düzenlemek üzere açmak üzere dosyaya çift tıklayın:

    Paneli düzenleme

  5. Var olan Pencereyi silin ve Arabirim Düzenleyicisi'ndeki Kitaplık Denetçisi'nden bir Panel sürükleyin:

    Varolan pencereyi silme

  6. Paneli Dosya Sahibi - penceresi - çıkışına takın:

    Paneli yukarı kabloya sürükleme

  7. Kimlik Denetçisi'ne geçin ve Panelin sınıfını olarak DocumentPanelayarlayın:

    Panelin sınıfını ayarlama

  8. Değişikliklerinizi kaydedin ve Xcode ile eşitlemek için Mac için Visual Studio dönün.

  9. DocumentPanel.cs Dosyasını düzenleyin ve sınıf tanımını aşağıdaki şekilde değiştirin:

    public partial class DocumentPanel : NSPanel

  10. Dosyadaki değişiklikleri kaydedin.

AppDelegate.cs Dosyasını düzenleyin ve yönteminin aşağıdaki gibi görünmesini sağlayınDidFinishLaunching:

public override void DidFinishLaunching (NSNotification notification)
{
        // Display panel
    var panel = new DocumentPanelController ();
    panel.Window.MakeKeyAndOrderFront (this);
}

Uygulamamızı çalıştırırsak panel görüntülenir:

Çalışan bir uygulamadaki panel

Önemli

Panel Pencereleri Apple tarafından kullanım dışı bırakıldı ve Denetçi Arabirimleri ile değiştirilmelidir.

Özet

Bu makalede, Xamarin.Mac uygulamasında Windows ve Panellerle çalışma konusuna ayrıntılı bir bakış sağlanır. Windows ve Panellerin farklı türlerini ve kullanımlarını, Xcode'un Interface Builder'ında Windows ve Panellerin nasıl oluşturulup tutulacağını ve C# kodunda Windows ve Paneller ile nasıl çalışacağını gördük.