Aracılığıyla paylaş


Özel metin girişi

Windows.UI.Text.Core ad alanında çekirdek metin API'leri, windows uygulamasının Windows cihazlarında desteklenen herhangi bir metin hizmetinden metin girişi almasını sağlar. API'ler, metin hizmetleri hakkında ayrıntılı bilgi sahibi olmak için uygulamanın gerekli olmaması nedeniyle Metin Hizmetleri Çerçevesi API'lerine benzer. Bu, uygulamanın herhangi bir dilde ve herhangi bir giriş türünden (klavye, konuşma veya kalem gibi) metin almasını sağlar.

Önemli API'ler: Windows.UI.Text.Core, CoreTextEditContext

Temel metin API'leri neden kullanılır?

Birçok uygulama için XAML veya HTML metin kutusu denetimleri metin girişi ve düzenleme için yeterlidir. Ancak, uygulamanız sözcük işleme uygulaması gibi karmaşık metin senaryolarını işliyorsa, özel metin düzenleme denetimi esnekliğine ihtiyacınız olabilir. Metin düzenleme denetiminizi oluşturmak için CoreWindow klavye API'lerini kullanabilirsiniz, ancak bunlar Doğu Asya dillerini desteklemek için gereken bileşim tabanlı metin girişini almak için bir yol sağlamaz.

Bunun yerine, özel metin düzenleme denetimi oluşturmanız gerektiğinde Windows.UI.Text.Core API'lerini kullanın. Bu API'ler, metin girişini her dilde işlemede size çok fazla esneklik sağlayacak şekilde tasarlanmıştır ve uygulamanıza en uygun metin deneyimini sağlamanıza olanak sağlar. Çekirdek metin API'leri ile oluşturulan metin girişi ve düzenleme denetimleri, Windows cihazlarında Metin Hizmetleri Çerçevesi tabanlı Giriş Yöntemi Düzenleyicileri'nden (IME'ler) ve bilgisayarlardaki el yazısından mobil cihazlardaki WordFlow klavyesine (otomatik düzeltme, tahmin ve dikte sağlayan) tüm metin giriş yöntemlerinden metin girişi alabilir.

Architecture

Aşağıda metin giriş sisteminin basit bir gösterimi yer alır.

  • "Uygulama", çekirdek metin API'leri kullanılarak oluşturulan özel düzenleme denetimini barındıran bir Windows uygulamasını temsil eder.
  • Windows.UI.Text.Core API'leri, Windows aracılığıyla metin hizmetleriyle iletişimi kolaylaştırır. Metin düzenleme denetimi ile metin hizmetleri arasındaki iletişim öncelikle iletişimi kolaylaştırmak için yöntemleri ve olayları sağlayan bir CoreTextEditContext nesnesi aracılığıyla işlenir.

CoreText mimari diyagramı

Metin aralıkları ve seçimi

Düzenleme denetimleri metin girişi için alan sağlar ve kullanıcılar bu alanın herhangi bir yerinde metin düzenlemeyi bekler. Burada, çekirdek metin API'leri tarafından kullanılan metin konumlandırma sistemini ve aralıkların ve seçimlerin bu sistemde nasıl temsil olduğunu açıklayacağız.

Uygulama imleç konumu

Metin API'lerinin çekirdek fonksiyonları ile kullanılan metin aralıkları, imleç konumları açısından ifade edilir. "Uygulama İmleç Konumu (ACP)", metin dizisinin başlangıcından itibaren imleçten hemen önceki karakterlerin sayısını gösteren sıfır tabanlı bir sayıdır.

Uygulama İmleç Konumu (ACP) karakter sayısını gösteren ekran görüntüsü

Metin aralıkları ve seçimi

Metin aralıkları ve seçimleri, iki alan içeren CoreTextRange yapısıyla temsil edilir:

Veri Alanı Veri türü Description
StartCaretPosition Sayı [JavaScript] | System.Int32 [.NET] | int32 [C++] Aralığın başlangıç konumu, ilk karakterin hemen öncesinde bulunan ACP'dir.
EndCaretPosition Sayı [JavaScript] | System.Int32 [.NET] | int32 [C++] Bir aralığın bitiş konumu, son karakterden hemen sonraki ACP'dir.

 

Örneğin, daha önce gösterilen metin aralığında [0, 5] aralığı "Hello" sözcüğünü belirtir. StartCaretPosition her zaman EndCaretPosition değerinden küçük veya eşit olmalıdır. [5, 0] aralığı geçersiz.

Ekleme noktası

Geçerli eklem yeri konumu, sıklıkla ekleme noktası olarak adlandırılır ve StartCaretPosition değeri EndCaretPosition değerine eşit ayarlanarak temsil edilir.

Bitişik olmayan seçim

Bazı düzenleme denetimleri bitişik olmayan seçimleri destekler. Örneğin, Microsoft Office uygulamaları birden çok rastgele seçimi destekler ve birçok kaynak kodu düzenleyicisi sütun seçimini destekler. Ancak, çekirdek metin API'leri bitişik olmayan seçimleri desteklemez. Düzenleme denetimleri yalnızca tek bir bitişik seçimi, çoğu zaman bitişik olmayan seçimlerin etkin alt aralığını raporlamalıdır.

Örneğin, aşağıdaki görüntüde iki bitişik olmayan seçim içeren bir metin akışı gösterilmektedir: [0, 1] ve [6, 11] ve düzenleme denetiminin yalnızca bir tane ([0, 1] veya [6, 11]) raporlaması gerekir.

İlk karakterin ve son beş karakterin seçildiği bitişik olmayan metin seçimini gösteren ekran görüntüsü.

Metinle çalışma

CoreTextEditContext sınıfı TextUpdating olayı, TextRequested olayı ve NotifyTextChanged yöntemi aracılığıyla Windows ve düzenleme denetimleri arasında metin akışını etkinleştirir.

Düzenleme denetiminiz, kullanıcılar klavye, konuşma veya IMI gibi metin giriş yöntemleriyle etkileşime geçtiğinde oluşturulan TextUpdating olayları aracılığıyla metin alır.

Düzenleme denetiminizdeki metni değiştirdiğinizde, örneğin, denetime metin yapıştırdığınızda NotifyTextChanged'i çağırarak Windows'a bildirmeniz gerekir.

Metin hizmeti yeni metni gerektiriyorsa textRequested olayı oluşturulur. TextRequested olay işleyicisinde yeni metni sağlamanız gerekir.

Metin güncelleştirmelerini kabul etme

Düzenleme denetiminiz genellikle kullanıcının girmek istediği metni temsil ettiğinden metin güncelleştirme isteklerini kabul etmelidir. TextUpdating olay işleyicisinde bu eylemler düzenleme denetiminizden beklenir:

  1. CoreTextTextUpdatingEventArgs.Text içinde belirtilen metni CoreTextUpdatingEventArgs.Range içinde belirtilen konuma ekleyin.
  2. Seçimi CoreTextTextUpdatingEventArgs.NewSelection içinde belirtilen konuma yerleştirin.
  3. CoreTextTextUpdatingEventArgs.Result öğesini CoreTextTextUpdatingResult.Succeeded olarak ayarlayarak güncelleştirmenin başarılı olduğunu sisteme bildirin.

Örneğin, bu, kullanıcı "d" tuşuna basmadan önce bir düzenleme kutusunun durumudur. Ekleme noktası [10, 10] konumundadır.

Eklemeden önce [10, 10] konumundaki ekleme noktasını gösteren metin akışı diyagramının ekran görüntüsü

Kullanıcı "d" yazdığınızda, aşağıdaki CoreTextTextUpdatingEventArgs verileriyle bir TextUpdating olayı oluşturulur:

Düzenleme denetiminizde, belirtilen değişiklikleri uygulayın ve Sonuç seçeneğini Başarılı olarak ayarlayın. Değişiklikler uygulandıktan sonra denetimin durumu aşağıdadır.

Ekleme sonrasında \[11, 11\] konumundaki ekleme noktasını gösteren metin akışı diyagramının ekran görüntüsü

Metin güncelleştirmelerini reddetme

Bazen, istenen aralık düzenleme denetiminin değiştirilmemesi gereken bir alanında olduğundan metin güncelleştirmelerini uygulayamazsınız. Bu durumda, hiçbir değişiklik uygulamamalısınız. Bunun yerine, CoreTextTextUpdatingEventArgs.Result ayarını CoreTextTextUpdatingResult.Failed olarak ayarlayarak güncelleştirmenin başarısız olduğunu sisteme bildirin.

Örneğin, yalnızca e-posta adresini kabul eden bir düzenleme denetimi düşünün. E-posta adresleri boşluk içeremediğinden boşluklar reddedilmelidir, bu nedenle boşluk anahtarı için TextUpdating olayları tetiklendiğinde düzenleme denetiminizde Sonuç seçeneğini Başarısız olarak ayarlamanız yeterlidir.

Metin değişikliklerini bildirme

Düzenleme denetiminiz bazen metin yapıştırıldığında veya otomatik olarak düzeltildiğinde olduğu gibi metinlerde değişiklik yapar. Böyle durumlarda, NotifyTextChanged yöntemini çağırarak metin hizmetlerine bu değişiklikleri bildirmeniz gerekir.

Örneğin, kullanıcı "World" kelimesini yapıştırmadan önce bir düzenleme denetiminin durumu şöyledir. Ekleme noktası [6, 6] konumundadır.

Eklemeden önce [6, 6] konumundaki ekleme noktasını gösteren metin akışı diyagramının ekran görüntüsü

Kullanıcı, değişiklikler uygulandıktan sonra yapıştırma eylemini ve düzenleme denetimini gerçekleştirir:

Ekleme sonrasında \[11, 11\] konumundaki ekleme noktasını gösteren metin akışı diyagramının ekran görüntüsü

Böyle bir durumda NotifyTextChanged'i şu bağımsız değişkenlerle çağırmalısınız:

  • modifiedRange = [6, 6]
  • newLength = 5
  • newSelection = [11, 11]

Metin hizmetlerinin üzerinde çalıştığı metni güncelleştirmek için işlediğiniz bir veya daha fazla TextRequested olayı izlenir.

Metin güncelleştirmelerini geçersiz kılma

Düzenleme denetiminizde, otomatik düzeltme özellikleri sağlamak için bir metin güncelleştirmesini geçersiz kılmak isteyebilirsiniz.

Örneğin, kısaltmaları resmileştiren bir düzeltme özelliği sunan bir düzenleme denetimi düşünün. Bu, kullanıcı düzeltmeyi tetikleyen boşluk anahtarını girmeden önce düzenleme denetiminin durumudur. Ekleme noktası [3, 3] konumundadır.

Eklemeden önce [3, 3] konumundaki ekleme noktasını gösteren metin akışı diyagramının ekran görüntüsü

Kullanıcı boşluk tuşuna basar ve buna karşılık gelen textUpdating olayı oluşturulur. Düzenleme denetimi metin güncelleştirmesini kabul eder. Bu, düzeltme tamamlanmadan önce düzenleme denetiminin kısa bir süre için durumudur. Ekleme noktası [4, 4] konumundadır.

Ekleme sonrasında [4, 4] konumundaki ekleme noktasını gösteren metin akışı diyagramının ekran görüntüsü

TextUpdating olay işleyicisinin dışında düzenleme denetimi aşağıdaki düzeltmeyi yapar. Bu, düzeltme tamamlandıktan sonra düzenleme denetiminin durumudur. Ekleme noktası [5, 5] konumundadır.

[5, 5] konumundaki ekleme noktasını gösteren metin akışı diyagramının ekran görüntüsü

Böyle bir durumda NotifyTextChanged'i şu bağımsız değişkenlerle çağırmalısınız:

  • modifiedRange = [1, 2]
  • newLength = 2
  • newSelection = [5, 5]

Metin hizmetlerinin üzerinde çalıştığı metni güncelleştirmek için işlediğiniz bir veya daha fazla TextRequested olayı izlenir.

İstenen metni sağlama

Metin hizmetlerinin, özellikle bir belgeyi yüklemek veya düzenleme denetimi tarafından eklenen metinler gibi, düzenleme denetiminde hali hazırda bulunan metinler için otomatik düzeltme veya tahmin özellikleri sunabilmesi adına doğru metne sahip olması önemlidir, önceki bölümlerde açıklandığı gibi. Bu nedenle, bir TextRequested olayı her tetiklendiğinde, belirtilen aralık için düzenleme denetiminizde bulunan metni sağlamanız gerekir.

CoreTextTextRequest içinde belirtilen Aralık bazen düzenleme denetiminizin olduğu gibi barındıramayacağı bir aralık içerebilir. Örneğin, Aralık, TextRequested olayı sırasında düzenleme denetiminin boyutundan daha büyükse veya Aralık'ın sonu sınırların dışındaysa. Bu tür durumlarda, genellikle istenen aralığın bir alt kümesi olan anlamlı bir aralığı döndürmelisiniz.

Samples

Arşiv örnekleri