Xamarin.Forms E-Kitap Okuyucu – Bölüm 20

Xamarin

E-Kitap projesi Github: https://github.com/SamedBll/XamChap/tree/master/simpbook

StackLayout içinde ScrollView, Nasıl mı?

Bir ScrollView’e StackLayout koymak genel bir şey ama ScrollView’u bir StackLayout’a koyabilir misiniz? Ve neden böyle bir şey yapalım ki?

Xamarin.Forms’daki gibi, layout sistemlerinde genel bir kural olup, bir scrollu stacke koyamazsınız. Bir ScrollView content’inin yüksekliği ile kendi yüksekliği arasındaki farkı hesaplamak için belirli bir yüksekliğe sahip olması gerekir. Bu fark, ScrollView contentini kaydırma miktarıdır. ScrollView bir StackLayout ise, o belirli yüksekliği almaz.

Peki neden zaten bir StackLayout içinde bir ScrollView isteyeyim mi?

Bazen tam ihtiyacınız olan şey bu. Kaydırmayı gerçekleştiren basit bir e-kitap okuyucu düşünün. Sayfanın üst kısmında her zaman kitabın başlığını görüntüleyen bir Label’dan sonra Kit’in içeriğiyle bir StackLayout içeren ScrollView isteyebilirsiniz. Bu labelın ve ScrollView’un, sayfayı dolduran bir StackLayout öğesinin alt öğesi olması uygun olur.

Xamarin.Forms ile böyle bir şey mümkündür. ScrollView’e VerticalOptions LayoutOptions.FillAndExpand ayarı verirseniz, gerçekten bir StackLayout öğesinin bir çocuğu olabilir. StackLayout diğer çocukların gerektirmediği tüm ek alanı ScrollView verecek ve ScrollView daha sonra belirli bir yüksekliğe sahip olacaktır. İlginçtir, Xamarin.Forms, VerticalOptions özelliğinin diğer ayarlarına karşı korur; böylece ayarladığınız her şeyle çalışır.

“AI” projesi, benim makalemin, kısa metni “AI is not AI”nin metnini görüntüler; bu metin AI.txt adlı bir metin dosyasında paragraf başına bir satırla biçimlendirilir.

AI programı bu kısa metine nasıl erişir? Belki de en kolay yöntem, metin dosyasını doğrudan programın yürütülebilir dosyasına gömmektir (embed) veya -Xamarin.Forms uygulaması olması durumunda- Portable Class Library DLL’sindedir. Bu dosyalar gömülü (embedded) kaynaklar olarak bilinir ve bu programda AI.txt dosyası budur.

Visual Studio’da veya Xamarin Studio’da gömülmüş (embedded) bir kaynak oluşturmak için, muhtemelen önce proje menüsünde Add>New Folder seçeneğini belirleyerek projede bir klasör oluşturmak istiyorsunuz. Metin dosyaları için bir klasör, örneğin Metin olarak adlandırılabilir. Klasör isteğe bağlıdır, ancak program assetlerini düzenlemeye yardımcı olur. Ardından, bu klasörde, Add> Existing Item’i Visual Studio’da seçebilirsiniz. Dosyaya gidin, dosyayı seçin ve Visual Studio’da Add’i tıklayın.

Şimdi önemli kısım: Dosya, projenin bir parçası olduktan sonra, dosyayla ilişkili menüden Properties iletişim kutusunu getir. Dosya için Build Action’ının EmbeddedResource olduğunu belirtin. Unutulması kolay bir adım bu, ancak bu çok önemli.

Bu, AI projesi için yapıldı ve dolayısıyla AI.txt dosyası AI.dll dosyasına gömülü hale geldi.

Kodda, System.Reflection namespace’indeki Assembly sınıfı tarafından tanımlanan GetManifestResourceStream metodunu çağırarak dosya alınabilir. PCL’nin assemblyisini (derlemesini) yapmak için, yapmanız gereken şey assemblyde tanımlanan herhangi bir sınıfın Type’ını almaktır. Typeof’u, o sınıfın örneğinde ContentPage veya GetType öğelerinden türettiğiniz sayfa türüne göre kullanabilirsiniz. Sonra bu Type nesnesinde GetTypeInfo öğesini çağırın. Assembly, sonuçta oluşan TypeInfo nesnesinin bir özelliğidir:

Assembly’in GetManifestResourceStream metodunda, kaynağın adını belirtmeniz gerekir. Gömülü kaynaklar için bu ad kaynak değil kaynak kimliği olan dosya adıdır. Bunları karıştırmak kolaydır, çünkü bu kimlik belirsiz bir şekilde tam bir dosya adı gibi görünebilir.

Kaynak kimliği (ID), derlemenin varsayılan ad alanıyla başlar. Bu, .NET namespace’i değildir! Visual Studio’da derlemenin varsayılan namespace’ini edinmek için, proje menüsünden Properties’i seçin ve özellikler diyaloğunda, soldaki Library seçin ve Default namespace’ini bulun. Xamarin Studio’da (bura sadece Xamarin Studio için, VS kullananlar karıştırmasın), proje menüsünden Seçenekler’i seçin ve Proje Seçenekleri iletişim kutusunda, soldaki Ana Ayarlar’ı seçin ve Varsayılan İsim Alanı etiketli bir alana bakın.

AI projesi için varsayılan namespace derleme ile aynı: “AI” (aslında ben projeye simpbook adı vermiştim J). Bununla birlikte, aslında varsayılan namespace’i istediğinize ayarlayabilirsiniz.

Kaynak kimliği (resource ID), default namespace ile başlar, ardından bir nokta gelir, ardından kullandığınız klasör adı, ardından başka bir nokta ve dosya adı gelir. Bu örnekte, kaynak kimliği “AI.Texts.AI.txt” dir ve kodda GetManifestResourceStream metoduna geçeceksiniz. Metod, bir .NET Stream nesnesi döndürür ve bundan metnin satırlarını okumak için bir StreamReader oluşturulabilir.

GetManifestResourceStream ve StreamReader nesnelerinden döndürülen Stream nesnesi ile ifadeler kullanmakta bulunmak iyi bir fikir; çünkü artık gerek duyulmadığında veya istisnaları ortaya çıkardığında nesneleri düzgün bir şekilde atacaktır.

Düzen (layout) amacıyla AIPage yapıcısı iki StackLayout nesnesi oluşturur: mainStack ve textStack. Dosyadaki ilk satır (hikayenin başlığını ve yazarını içeren) mainStack’te kalın ve ortalanmış bir Label haline gelir; sonraki tüm satırlar textStack’e gider. MainStack örneği textStack içeren bir ScrollView de içerir.

Çünkü bu temelde bir e-kitap okuyucu ve insanlar yüzlerce yıldır beyaz kağıt üzerinde siyah metin okuyorlar, sayfanın BackgroundColor’u beyaza, her Label’in TextColor’u siyaha ayarlı:

AI bir PCL uygulamasıdır. Bu programı bir PCL yerine Paylaşılan Varlık Projesi kullanarak yazmak da mümkündür. Bunu ispatlamak için, bu bölümdeki kodla birlikte bir AISap projesi bulunur. Bununla birlikte, kaynak (resource) aslında uygulama projesinin bir parçası haline geldiğinden, uygulama için namespace alanına ihtiyacınız olacak ve bu her platform için farklı. Kaynak (resource) değişkenini ayarlama kodu şuna benzer:

Gömülü bir kaynağa başvurmada sorun yaşıyorsanız, yanlış bir ad kullanıyor olabilirsiniz. Tüm embedded kaynakların kaynak kimliklerinin listesini almak için, GetManifestResourceNames öğesini Assembly nesnesinde çağırmayı deneyin.

Previous
Open Source Xamarin
Next
Xamarin.Forms ile Görüntü İşleme

Leave a comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir