Xamarin.Mac'te Özel Denetimler Oluşturma
Bir Xamarin.Mac uygulamasında C# ve .NET ile çalışırken, Swift ve Xcode'da çalışan bir geliştiricinin sahip olduğu Kullanıcı Denetimlerine Objective-CObjective-Cerişebilirsiniz. Xamarin.Mac doğrudan Xcode ile tümleşik olduğundan, Kullanıcı Denetimlerinizi oluşturmak ve korumak (veya isteğe bağlı olarak bunları doğrudan C# kodunda oluşturmak) için Xcode'un Interface Builder'sini kullanabilirsiniz.
macOS çok çeşitli yerleşik Kullanıcı Denetimleri sağlasa da, hazır olarak sağlanmış olmayan işlevler sağlamak veya özel kullanıcı arabirimi temasıyla (oyun arabirimi gibi) eşleşmek için özel bir denetim oluşturmanız gerekebiliyor olabilir.
Bu makalede, bir Xamarin.Mac uygulamasında yeniden kullanılabilir özel Kullanıcı Arabirimi Denetimi oluşturmanın temellerini ele alalarız. Öncelikle Hello, Mac makalesi, özellikle de Xcode'a giriş ve Interface Builder ve Çıkışlar ve Eylemler bölümlerine bakarak bu makalede kullanacaklarımız temel kavramları ve teknikleri gözden geçirin.
Exposing C# classes / methods to Objective-CExposing C# classes / methods to Objective-C belgesinin C# sınıflarınızı nesnelere ve KULLANıCı Arabirimi Öğelerine kablolamak için kullanılan ve komutlarını da açıklayan bölümüne göz RegisterExportObjective-C atabilirsiniz.
Özel Denetimlere Giriş
Yukarıda belirtildiği gibi, Xamarin.Mac uygulama arabiriminize benzersiz işlevsellik sağlamak veya özel bir kullanıcı arabirimi teması (oyun arabirimi gibi) oluşturmak için yeniden kullanılabilir, Özel Kullanıcı Arabirimi Denetimi oluşturmanız gereken zamanlar olabilir.
Böyle durumlarda, C# kodu aracılığıyla veya Xcode'un kullanıcı arabirimi aracılığıyla uygulama arabirimine eklenebiliyor veya özel bir araç NSControl Interface Builder. Özel denetiminizi devralarak, yerleşik bir Denetim'in sahip olduğu tüm standart NSControl özelliklere otomatik Kullanıcı Arabirimi (örneğin, ) sahip NSButton olur.
Özel Kullanıcı Arabirimi denetiminiz yalnızca bilgileri (özel grafik ve grafik aracı gibi) görüntülerse, yerine 'den devralmak NSView istiyor NSControl olabilir.
Hangi temel sınıf kullanılırsa kullan, özel denetim oluşturmanın temel adımları aynıdır.
Bu makalede, benzersiz bir Kullanıcı Arabirimi Theme sağlayan özel bir Çevirme Anahtarı bileşeni ve tam işlevsel bir Özel Anahtar Denetimi oluşturma Kullanıcı Arabirimi oluşturacak.
Özel Denetimi Oluşturma
Oluşturmakta olduğu özel denetim kullanıcı girişine yanıt ver (farenin sol düğmesi tıklamaları) ile NSControl devralınacak. Bu şekilde özel denetimimiz, yerleşik bir Kullanıcı Arabirimi Control'un sahip olduğu tüm standart özelliklere otomatik olarak sahip olur ve standart bir macOS denetimi gibi yanıt verir.
Bu Mac için Visual Studio, özel bir Kullanıcı Arabirimi Denetimi oluşturmak istediğiniz Xamarin.Mac projesini açın (veya yenisini oluşturun). Yeni bir sınıf ekleyin ve bunu NSFlipSwitch çağır:
Ardından sınıfını NSFlipSwitch.cs düzenleyin ve aşağıdakine benzer şekilde düzenleyin:
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
}
}
içinde özel sınıfımız hakkında ilk olarak bu sınıfı ve NSControl Xcode'un komutlarını ortaya çıkarmak için NSControl komutunu devralıyor ve Objective-C Interface Builder:
[Register("NSFlipSwitch")]
public class NSFlipSwitch : NSControl
Aşağıdaki bölümlerde yukarıdaki kodun geri kalanına ayrıntılı bir şekilde göz atacağız.
Denetimin Durumunu İzleme
Özel Denetimimiz bir anahtar olduğu için anahtarın Açık/Kapalı durumunu izlemek için bir yol gerekir. Bunu içinde aşağıdaki kodla ele NSFlipSwitch alarız:
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ştirdiğinde kullanıcı arabirimini güncelleştirmenin bir yolunu bulamamız gerekir. Bunu yapmak için denetimi ile kullanıcı arabirimini yeniden çizime NeedsDisplay = true zorlarız.
Denetimimiz tek bir Açık/Kapalı durumdan daha fazlasını (örneğin, 3 konuma sahip çok durumlu bir anahtar) gerekli olursa, durumu izlemek için bir Enum kullanabiliriz. Bizim örneğimizde basit bir bool bunu yapar.
Anahtarın durumunu Açık ve Kapalı arasında değiştirmek için bir yardımcı yöntem de ekledik:
private void FlipSwitchState() {
// Update state
Value = !Value;
}
Daha sonra bu yardımcı sınıfını genişleterek anahtar durumu değişerek çağıranı bilgilendireceğiz.
Denetimin Arabirimini Çizme
Çalışma zamanında özel denetimimizin temel grafik çizim yordamlarını kullanarak özel denetimimizin Kullanıcı Arabirimi çizin. Bunu yapmak için önce denetimimiz için katmanları açmamız gerekir. Bunu aşağıdaki özel yöntemle yapabiliriz:
private void Initialize() {
this.WantsLayer = true;
this.LayerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay;
}
Denetimin düzgün yapılandırıldığından emin olmak için bu yöntem denetimin oluşturucularından çağrılır. Örnek:
public NSFlipSwitch (IntPtr handle) : base (handle)
{
// Init
Initialize();
}
Ardından, yöntemini geçersiz kılmamız DrawRect ve denetimi çizmek için Temel Grafik yordamlarını eklememiz gerekir:
public override void DrawRect (CGRect dirtyRect)
{
base.DrawRect (dirtyRect);
// Use Core Graphic routines to draw our UI
...
}
Durumu değişirken denetimin görsel gösterimini ayarlaacağız (örneğin Açık'tan Kapalı'ya). Durum her değiştinde, denetimi yeni NeedsDisplay = true durum için yeniden çizime zorlamak için komutunu kullanabiliriz.
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ıycılarını Geçersiz Kılma. Hangi yöntemi kullanıruz, denetimimiz için gereken işlevlere dayalı olacak.
Önemli
Oluşturdukları tüm özel denetimler için Geçersiz Kılma Yöntemleri veya Hareket Tanıyıcılarkullanabilirsiniz,ancak ikisi de aynı anda çakışmaz.
Geçersiz Kılma Yöntemleriyle Kullanıcı Girişini İşleme
(veya ) tarafından NSControl devralınan NSView nesneler, fare veya klavye girişini işlemeye yönelik çeşitli geçersiz kılma yöntemlerine sahiptir. Örnek denetimimizde, kullanıcı farenin sol düğmesiyle denetime tıkladığında anahtarın Durumunu Açık ve Kapalı arasında çevirmek istiyoruz. Bunu işlemek için sınıfına aşağıdaki geçersiz kılma NSFlipSwitch 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önteminde FlipSwitchState anahtarın Açık/Kapalı durumunu çevirmek için yöntemini (yukarıda tanımlanmıştır) MouseDown çağırmış oluruz. Bu, denetimin geçerli durumu yansıtacak şekilde yeniden çizilmelerini de zorlar.
Hareket Tanıycılar ile Kullanıcı Girişini İşleme
İsteğe bağlı olarak, kullanıcının denetimle etkileşim kurmasını işlemek için Hareket Tanımaları kullanabilirsiniz. Yukarıda eklenen geçersiz kılmaları kaldırın, yöntemini Initialize düzenleyin ve aşağıdaki gibi yapı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 bir oluşturuyor ve kullanıcı farenin sol düğmesiyle üzerine tıkladığında anahtarın durumunu değiştirmek NSClickGestureRecognizerFlipSwitchState için yöntemimizi çağırıyoruz. yöntemi, AddGestureRecognizer (click) denetime Hareket Tanıyıcı'sını ekler.
Yine, hangi yöntemi kullanıruz, özel denetimimiz ile neyi başarmaya ç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öntemlerini kullanın. Fare tıklamaları gibi önceden tanımlanmış işlevlere ihtiyacımız varsa Hareket Tanıyıcılar'a tıklayın.
Durum Değişikliği Olaylarına Yanıt Verme
Kullanıcı özel denetimimizin durumunu değiştirdığında, kodda durum değişikliğine yanıt vermek için bir yol (örneğin, özel bir düğmeye tıkladığında bir şey yapmak) gerekir.
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 FlipSwitchState düzenleyin ve aşağıdakine benzer şekilde düzenleyin:
private void FlipSwitchState() {
// Update state
Value = !Value;
RaiseValueChanged ();
}
İlk olarak, kullanıcı anahtarın durumunu değiştirse bir eylem gerçekleştirmek için C# kodunda 'ye işleyici ekleyelim ValueChanged bir olay sağlariz.
İkincisi, özel denetimimiz 'den devraldığı için, otomatik olarak Xcode'un kodunda atanabilir NSControl bir Eylem Interface Builder. NSControl Durum değiştinde bu Eylemi çağırarak aşağıdaki kodu kullanıruz:
if (this.Action !=null)
NSApplication.SharedApplication.SendAction (this.Action, this.Target, this);
İlk olarak denetime bir Eylem atanma olup ola bir kontrol etmektir. Ardından, tanımlanmışsa Eylem çağrısında bulunduk.
Özel Denetimi Kullanma
Özel denetimimiz tam olarak tanımlandığı için C# kodu kullanarak veya Xcode'un kullanıcı arabiriminde Xamarin.Mac uygulamamızın kullanıcı arabirimine Interface Builder.
Interface Builder kullanarak denetimi eklemek için, önce Xamarin.Mac projesinin temiz bir derlemesini düzenleyin, sonra dosyayı çift tıklatın ve düzenlemek Main.storyboard Interface Builder açın:
Ardından, Custom View bir'i Kullanıcı Arabirimi sürükleyin:
Özel Görünüm seçiliyken Kimlik Denetçisi'ne geçiş yapmak ve görünümün Sınıfını olarak değiştirmek.
Yardımcı Düzenleyici'ye geçiş yaparak özel denetim için bir Çıkış oluşturun (dosyayı bağlamayı değil dosyaya bağlamayı emin olun):
Değişikliklerinizi kaydedin, Mac için Visual Studio geri dönüp değişikliklerin eşitlensin. dosyasını ViewController.cs düzenleyin ve yöntemini ViewDidLoad aşağıdaki gibi yapın:
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 tanımlandığımız olayı yanıt olarak verir ve kullanıcı denetime tıkladığında ValueChangedNSFlipSwitch geçerli Değeri yazabilirsiniz. ValueChanged
İsteğe bağlı olarak, denetimde Interface Builder eylem tanımlayabiliriz:
Dosyayı yeniden 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 Eylem tanımlamanız Interface Builder, ancak her iki yöntemi aynı anda kullanmamanız gerekir ya da bunlar çakışabilirsiniz.
Özet
Bu makale, bir Xamarin.Mac uygulamasında yeniden kullanılabilir özel Kullanıcı Arabirimi Denetimi oluşturmaya ayrıntılı bir bakış sağlar. Fare ve kullanıcı girişlerine yanıt vermenin iki ana yolu olan özel denetimler kullanıcı arabirimini çizmeyi ve yeni denetimi Xcode'un kullanıcı arabiriminde eylemlere Interface Builder.






