Xamarin.Mac'te Özel Denetimler Oluşturma

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

macOS birçok yerleşik Kullanıcı Denetimi sağlarken, kullanıma sunulmayan işlevler sağlamak veya özel kullanıcı arabirimi temasıyla (oyun arabirimi gibi) eşleştirmek için özel denetim oluşturmanız gerekebilir.

Özel kullanıcı arabirimi denetimi örneği

Bu makalede, Xamarin.Mac uygulamasında yeniden kullanılabilir bir Özel Kullanıcı Arabirimi Denetimi oluşturmanı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

Özel Denetimlere Giriş

Yukarıda belirtildiği gibi, Xamarin.Mac uygulamanızın kullanıcı arabirimi için benzersiz işlevler sağlamak veya özel bir kullanıcı arabirimi teması (oyun arabirimi gibi) oluşturmak için yeniden kullanılabilir bir Özel Kullanıcı Arabirimi Denetimi oluşturmanız gerekebilir.

Bu durumlarda, C# kodu veya Xcode'un Arabirim Oluşturucusu aracılığıyla uygulamanızın kullanıcı arabirimine eklenebilen özel bir aracı kolayca devralabilir NSControl ve oluşturabilirsiniz. Özel denetiminizden NSControl devralarak, yerleşik bir Kullanıcı Arabirimi Denetimi'nin sahip olduğu tüm standart özelliklere (örneğin) otomatik olarak NSButtonsahip olursunuz.

Özel Kullanıcı Arabirimi denetiminiz yalnızca bilgileri (özel grafik ve grafik aracı gibi) görüntülüyorsa, yerine NSControlöğesinden NSView devralmak isteyebilirsiniz.

Hangi temel sınıf kullanılırsa kullansın, özel denetim oluşturmaya yönelik temel adımlar aynıdır.

Bu makalede, benzersiz bir Kullanıcı Arabirimi Teması ve tam işlevsel bir Özel Kullanıcı Arabirimi Denetimi oluşturma örneği sağlayan özel bir Flip Switch bileşeni oluşturacaksınız.

Özel Denetim Oluşturma

Oluşturduğumuz özel denetim kullanıcı girişine yanıt vereceğinden (sol fare düğmesi tıklamaları), öğesinden NSControldevralacağız. Bu şekilde, özel denetimimiz otomatik olarak yerleşik bir Kullanıcı Arabirimi Denetimi'nin sahip olduğu tüm standart özelliklere sahip olur ve standart bir macOS denetimi gibi yanıt verir.

Mac için Visual Studio'da, için Özel Kullanıcı Arabirimi Denetimi oluşturmak (veya yeni bir tane oluşturmak) istediğiniz Xamarin.Mac projesini açın. Yeni bir sınıf ekleyin ve öğesini çağırarak:NSFlipSwitch

Yeni sınıf ekleme

Ardından sınıfı düzenleyin NSFlipSwitch.cs ve aşağıdaki gibi görünmesini sağlayın:

using Foundation;
using System;
using System.CodeDom.Compiler;
using AppKit;
using CoreGraphics;

namespace MacCustomControl
{
    [Register("NSFlipSwitch")]
    public class NSFlipSwitch : NSControl
    {
        #region Private Variables
        private bool _value = false;
        #endregion

        #region Computed Properties
        public bool Value {
            get { return _value; }
            set {
                // Save value and force a redraw
                _value = value;
                NeedsDisplay = true;
            }
        }
        #endregion

        #region Constructors
        public NSFlipSwitch ()
        {
            // Init
            Initialize();
        }

        public NSFlipSwitch (IntPtr handle) : base (handle)
        {
            // Init
            Initialize();
        }

        [Export ("initWithFrame:")]
        public NSFlipSwitch (CGRect frameRect) : base(frameRect) {
            // Init
            Initialize();
        }

        private void Initialize() {
            this.WantsLayer = true;
            this.LayerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay;
        }
        #endregion

        #region Draw Methods
        public override void DrawRect (CGRect dirtyRect)
        {
            base.DrawRect (dirtyRect);

            // Use Core Graphic routines to draw our UI
            ...

        }
        #endregion

        #region Private Methods
        private void FlipSwitchState() {
            // Update state
            Value = !Value;
        }
        #endregion

    }
}

bu sınıfı ve Xcode'un Arabirim Oluşturucusu'nda kullanıma açmak için Register komutunu devraldığımız NSControl ve bu sınıfı kullandığımız özel sınıfımız Objective-C hakkında dikkate alacağımız ilk şey:

[Register("NSFlipSwitch")]
public class NSFlipSwitch : NSControl

Aşağıdaki bölümlerde yukarıdaki kodun geri kalanına ayrıntılı olarak göz atacağız.

Denetimin Durumunu İzleme

Özel Denetimimiz bir anahtar olduğundan, anahtarın Açık/Kapalı durumunu izlemenin bir yolunu bulmalıyız. Bunu içinde NSFlipSwitchaşağıdaki kodla işleyeceğiz:

private bool _value = false;
...

public bool Value {
    get { return _value; }
    set {
        // Save value and force a redraw
        _value = value;
        NeedsDisplay = true;
    }
}

Anahtarın durumu değiştiğinde, kullanıcı arabirimini güncelleştirmenin bir yolunu bulmalıyız. Bunu yapmak için denetimi ile NeedsDisplay = truekullanıcı arabirimini yeniden çizmeye zorlarız.

Denetimimiz tek bir Açık/Kapalı durumundan (örneğin, 3 konumlu çok durumlu bir anahtar) daha fazla gerektiriyorsa, durumu izlemek için bir Enum kullanabilirdik. Bizim örneğimizde basit bir bool olacaktır.

Ayrıca, anahtarın durumunu Açık ve Kapalı arasında değiştirmek için bir yardımcı yöntem ekledik:

private void FlipSwitchState() {
    // Update state
    Value = !Value;
}

Daha sonra, anahtar durumu değiştiğinde çağıranı bilgilendirmek için bu yardımcı sınıfı genişleteceğiz.

Denetimin Arabirimini Çizme

Özel denetimimizin Kullanıcı Arabirimini çalışma zamanında çizmek için Core Graphic çizim yordamlarını kullanacağız. Bunu yapılabilmesi için önce denetimimiz için katmanları açmamız gerekir. Bunu aşağıdaki özel yöntemle yaparız:

private void Initialize() {
    this.WantsLayer = true;
    this.LayerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay;
}

Bu yöntem, denetimin düzgün yapılandırıldığından emin olmak için denetimin oluşturucularının her birinden çağrılır. Örneğin:

public NSFlipSwitch (IntPtr handle) : base (handle)
{
    // Init
    Initialize();
}

Ardından, yöntemini geçersiz kılmamız DrawRect ve denetimi çizmek için Core Graphic yordamlarını eklememiz gerekir:

public override void DrawRect (CGRect dirtyRect)
{
    base.DrawRect (dirtyRect);

    // Use Core Graphic routines to draw our UI
    ...

}

Durumu değiştiğinde denetimin görsel gösterimini ayarlayacağız (açıktan kapalıya geçmek gibi). Durum her değiştiğinde, denetimi yeni durum için yeniden çizmeye zorlamak için komutunu kullanabiliriz NeedsDisplay = true .

Kullanıcı Girişine Yanıt Verme

Özel denetimimize kullanıcı girişi eklemenin iki temel yolu vardır: Fare İşleme Yordamlarını veya Hareket Tanıyıcılarını Geçersiz Kılma. Hangi yöntemi kullanacağımız, denetimimizin gerektirdiği işlevlere dayalı olacaktır.

Önemli

Oluşturduğunuz herhangi bir özel denetim için Geçersiz Kılma Yöntemleri veya Hareket Tanıyıcıları kullanmanız gerekir, ancak her ikisi de birbiriyle çakışabileceği gibi aynı anda kullanamazsınız.

Geçersiz Kılma Yöntemleriyle Kullanıcı Girişini İşleme

(veya NSView) öğesinden NSControl devralan nesneler, fare veya klavye girişini işlemek için çeşitli geçersiz kılma yöntemlerine sahiptir. Örnek denetimimiz için, kullanıcı sol fare düğmesiyle denetime tıkladığında Açık ve Kapalı arasındaki anahtarın durumunu çevirmek istiyoruz. Bunu işlemek için sınıfına NSFlipSwitch aşağıdaki geçersiz kılma yöntemlerini ekleyebiliriz:

#region Mouse Handling Methods
// --------------------------------------------------------------------------------
// Handle mouse with Override Methods.
// NOTE: Use either this method or Gesture Recognizers, NOT both!
// --------------------------------------------------------------------------------
public override void MouseDown (NSEvent theEvent)
{
    base.MouseDown (theEvent);

    FlipSwitchState ();
}

public override void MouseDragged (NSEvent theEvent)
{
    base.MouseDragged (theEvent);
}

public override void MouseUp (NSEvent theEvent)
{
    base.MouseUp (theEvent);
}

public override void MouseMoved (NSEvent theEvent)
{
    base.MouseMoved (theEvent);
}
## endregion

Yukarıdaki kodda, yöntemindeki anahtarın FlipSwitchState MouseDown Açık/Kapalı durumunu çevirmek için yöntemini (yukarıda tanımlanmıştır) çağırırız. Bu, denetimin geçerli durumu yansıtacak şekilde yeniden çizilmesine de zorlar.

Hareket Tanıyıcılarla Kullanıcı Girişini İşleme

İsteğe bağlı olarak, denetimle etkileşim kuran kullanıcıyı işlemek için Hareket Tanıyıcıları kullanabilirsiniz. Yukarıda eklenen geçersiz kılmaları kaldırın, yöntemini düzenleyin Initialize ve aşağıdaki gibi görünmesini sağlayın:

private void Initialize() {
    this.WantsLayer = true;
    this.LayerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay;

    // --------------------------------------------------------------------------------
    // Handle mouse with Gesture Recognizers.
    // NOTE: Use either this method or the Override Methods, NOT both!
    // --------------------------------------------------------------------------------
    var click = new NSClickGestureRecognizer (() => {
        FlipSwitchState();
    });
    AddGestureRecognizer (click);
}

Burada yeni NSClickGestureRecognizer bir oluşturup kullanıcı sol fare düğmesiyle üzerine tıkladığında anahtarın durumunu değiştirmek için yöntemimizi FlipSwitchState çağırıyoruz. yöntemi, AddGestureRecognizer (click) Denetime Hareket Tanıyıcısını ekler.

Yine, hangi yöntemi kullandığımız, özel denetimimizle neyi gerçekleştirmeye çalıştığımıza bağlıdır. Kullanıcı etkileşimine düşük düzeyde erişime ihtiyacımız varsa Geçersiz Kılma Yöntemleri'ni kullanın. Fare tıklamaları gibi önceden tanımlanmış işlevlere ihtiyacımız varsa Hareket Tanıma'yı kullanın.

Durum Değişikliği Olaylarına Yanıt Verme

Kullanıcı özel denetimimizin durumunu değiştirdiğinde, koddaki durum değişikliğine yanıt vermenin bir yolunu bulmalıyız (örneğin, özel bir düğmeye tıkladığında bir şey yapmak).

Bu işlevi sağlamak için sınıfını NSFlipSwitch düzenleyin ve aşağıdaki kodu ekleyin:

#region Events
public event EventHandler ValueChanged;

internal void RaiseValueChanged() {
    if (this.ValueChanged != null)
        this.ValueChanged (this, EventArgs.Empty);

    // Perform any action bound to the control from Interface Builder
    // via an Action.
    if (this.Action !=null)
        NSApplication.SharedApplication.SendAction (this.Action, this.Target, this);
}
## endregion

Ardından yöntemini düzenleyin FlipSwitchState ve aşağıdaki gibi görünmesini sağlayın:

private void FlipSwitchState() {
    // Update state
    Value = !Value;
    RaiseValueChanged ();
}

İlk olarak, kullanıcı anahtarın durumunu değiştirdiğinde bir eylem gerçekleştirebilmemiz için C# kodunda işleyici ekleyebileceğimiz bir olay sağlarız ValueChanged .

İkinci olarak, özel denetimimiz öğesinden NSControldevraldığından otomatik olarak Xcode'un Arabirim Oluşturucusu'nda atanabilecek bir Eyleme sahiptir. Durum değiştiğinde bu Eylemi çağırmak için aşağıdaki kodu kullanırız:

if (this.Action !=null)
    NSApplication.SharedApplication.SendAction (this.Action, this.Target, this);

İlk olarak, denetime bir Eylem atanmış olup olmadığını denetleriz. Ardından, tanımlanmışsa Eylem'i çağıracağız.

Özel Denetimi Kullanma

Özel denetimimiz tam olarak tanımlandığında, bunu C# kodunu kullanarak veya Xcode'un Arabirim Oluşturucusu'nda Xamarin.Mac uygulamamızın kullanıcı arabirimine ekleyebiliriz.

Denetimi Interface Builder kullanarak eklemek için, önce Xamarin.Mac projesinin temiz bir derlemesini yapın, ardından dosyayı düzenlemek üzere Arabirim Oluşturucusu'nda açmak üzere çift tıklayın Main.storyboard :

Xcode'da görsel taslak düzenleme

Ardından, kullanıcı arabirimi tasarımına bir Custom View sürükleyin:

Kitaplıktan Özel Görünüm Seçme

Özel Görünüm seçili durumdayken Kimlik Denetçisi'ne geçin ve görünümün Sınıfını olarak NSFlipSwitchdeğiştirin:

Görünüm'ün sınıfını ayarlama

Yardımcı Düzenleyici'ye geçin ve özel denetim için bir Outlet oluşturun (dosyayı değil .m dosyaya ViewController.h bağladığından emin olun):

Yeni çıkış yapılandırma

Değişikliklerinizi kaydedin, Mac için Visual Studio dönün ve değişikliklerin eşitlenmesine izin verin. ViewController.cs Dosyasını düzenleyin ve yönteminin aşağıdaki gibi görünmesini sağlayınViewDidLoad:

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

    // Do any additional setup after loading the view.
    OptionTwo.ValueChanged += (sender, e) => {
        // Display the state of the option switch
        Console.WriteLine("Option Two: {0}", OptionTwo.Value);
    };
}

Burada, yukarıda sınıf üzerinde NSFlipSwitch tanımladığımız olaya yanıt ValueChanged verir ve kullanıcı denetime tıkladığında geçerli Değeri yazarız.

İsteğe bağlı olarak, Arabirim Oluşturucusu'na dönebilir ve denetimde bir Eylem tanımlayabiliriz:

Yeni eylem yapılandırma

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

partial void OptionTwoFlipped (Foundation.NSObject sender) {
    // Display the state of the option switch
    Console.WriteLine("Option Two: {0}", OptionTwo.Value);
}

Önemli

Olayı veya Arabirim Oluşturucusu'nda bir Eylem tanımlamanız gerekir, ancak her iki yöntemi de aynı anda kullanmamalısınız veya birbirleriyle çakışabilir.

Özet

Bu makalede, Xamarin.Mac uygulamasında yeniden kullanılabilir bir Özel Kullanıcı Arabirimi Denetimi oluşturma konusuna ayrıntılı bir bakış verilmişti. Fare ve kullanıcı girişine yanıt vermenin iki ana yolu olan özel denetim kullanıcı arabirimini çizmeyi ve Xcode'un Arabirim Oluşturucusu'ndaki Eylemler'de yeni denetimi kullanıma sunmanın yollarını gördük.