İpuçları ve Sorun Giderme
FmgLib.MauiMarkup ile çalışırken en sık ortaya çıkan sorulara pratik yanıtlar.
Adlandırma ve Keşfedilebilirlik#
"Bir metot adını nasıl tahmin ederim?"
- Özellik
Foo→ metot.Foo(value). Her zaman. - Olay
Bar→.OnBar(handler)veya.OnBar(sender => …). - Attached property
Owner.Prop→.OwnerProp(...)(Shell.TitleColor→ShellTitleColor); istisna: sahip önekini atan Grid yerleşimi (Grid.Row→Row). Tam tablo: Attached Property'ler. - Bir alt sınıfta
newile farklı tiple gizlenen özellik →.PropNameNew(...)(ayrıntılar).
"Beklediğim bir metot yok."
using FmgLib.MauiMarkup;(veya global using) var mı kontrol edin.- Özellik gerçek bir
BindablePropertymi? Düz CLR özellikleri fluent metot almaz —InvokeOnElementveya özel genişletme kullanın. - Üçüncü parti kontrol mü?
[MauiMarkup(typeof(...))]veya otomatik generator modu gerekir (Üçüncü Parti Kontroller). - Metot muhtemelen aynı adla bir taban sınıf genişletmesinde yaşıyor (yaprak tip onu miras alır). Yalnızca gerçekten tip değiştiren yeniden bildirimler
Newekini taşır.
Yaygın Derleme Hataları#
"FmgLib metodu ile başka bir markup kütüphanesi arasında belirsiz çağrı" — aynı dosyanın using'lerinden diğer fluent-markup paketlerini (örn. CommunityToolkit.Maui.Markup) kaldırın veya tam nitelendirin. İki kütüphaneyi bir projede karıştırmak çalışır, ama bir dosyada karıştırmaktan kaçının.
Bir özellik metodunda "lambda ifadesi dönüştürülemiyor" — builder lambda'sı builder zincirini döndürmelidir: e => e.Path("X") (ifade), e => { e.Path("X"); } (void döndüren deyim) değil.
MenuFlyout / Style<T> / VisualState<T>'te koleksiyon başlatıcı sözdizimi başarısız — fluent çağrılar { … } başlatıcı bloğundan sonra gelmeli:
new MenuFlyoutSubItem() { /* öğeler */ }.Text("Alt menü") // ✅
Çalışma Zamanı Tuzakları#
Binding sessizce hiçbir şey yapmıyor
Pathstring yazım hatası — bunları derleme hatasına çevirmek için derlenmiş binding'leri (e.Getter(...)) tercih edin.- Yanlış
BindingContext— şablonların öğeye yeniden bağlandığını unutmayın; kaçmak için.Source(...)kullanın (Özellik Bağlama). - Bağlanan nesne
INotifyPropertyChangedtetiklemiyor.
Center() metnimi ortalamıyor — Center() kontrolü ebeveyninde konumlandırır; TextCenter() metni kontrolün içinde hizalar. Bkz. Yerleşim Seçenekleri vs Metin Hizalama.
Tema değerleri OS tema değişiminde güncellenmiyor — builder kullandığınızdan emin olun (.TextColor(e => e.OnLight(...).OnDark(...))), bir kez değerlendirilen ternary değil (.TextColor(isDark ? … : …)).
Hot reload sayfayı yenilemiyor — tam kontrol listesi: Hot Reload. Özetle: bir hot-reload kanalından çalıştırın (dotnet watch run veya hot reload'lu IDE debug), Debug Console'da update received satırını arayın, sayfanın IFmgLibHotReload uyguladığından emin olun.
Hot reload ile düzenlerken durum sıfırlanıyor — durumu Build()'ten alanlara/constructor'a taşıyın.
Hot reload sonrası çift olay işleyicileri — Build() içinde uzun ömürlü nesnelere bağlanan handler'lar birikir; bunları constructor'a taşıyın.
Mimari Önerileri#
- Bir sayfa = bir sınıf, UI
Build()'te, durum alanlarda, mantık view model'de.FmgLibContentPage<TViewModel>tabanı size tipli birBindingContextverir. - Tekrarlayan alt ağaçları private metotlara veya
ContentViewbileşenlerine çıkarın — XAML'e göre en büyük okunabilirlik kazancı budur (Tam Örnekler). - Tasarım token'larını merkezileştirin: statik bir
AppColors/AppStylessınıfı artı uygulama düzeyiResourceDictionary(Stiller). - Tüm view-model yolları için derlenmiş binding'leri tercih edin; string yolları yalnızca hızlı kontrolden-kontrole bağlantı için tutun.
- Doğru tepki aracını seçin: sabit → doğrudan değer; VM-sürücülü → binding; duruma bağlı görseller → visual state'ler; koşula bağlı özellikler → trigger'lar; yeniden kullanılabilir kontrol mantığı → behavior'lar; tek seferlik → olay işleyici.
Performans Notları#
- Doğrudan değerler (
.FontSize(14)) düzSetValueçağrılarıdır — sıfır binding ek yükü. Hiç değişmeyeni bağlamayın. - Derlenmiş binding'ler reflection'dan kaçınır; özellikle öğe şablonlarında kullanın.
CollectionViewsanallaştırır;BindableLayoutsanallaştırmaz — küçük tutun.- Mümkünse layout özellikleri yerine transform'ları (
Translation,Scale,Opacity) animasyonlayın (Animasyonlar). - Otomatik generator modunda üretim referans edilen her kontrolü kapsar — derleme süreleri artarsa açık
[MauiMarkup]attribute'lerine geçin.
SSS#
XAML ve FmgLib sayfalarını karıştırabilir miyim? Evet — sayfa başına. Kademeli geçiş yapın.
Shell/Navigation/DI/Essentials ile çalışıyor mu? Evet; kütüphane yalnızca view'ları nasıl kurduğunuzu değiştirir, uygulama mimarisini değil. Bkz. Shell Uygulamaları.
CommunityToolkit.Mvvm, ObservableObject, RelayCommand çalışıyor mu? Tamamen — e.Path(...)/e.Getter(...) ile bağlayın ve .Command(...) her zamanki gibi.
Kütüphanenin kapsamadığı bir özelliği nasıl ayarlarım? InvokeOnElement veya yakalanan referans üzerinde düz C#.
Gerçek dünya örnekleri nerede? Deponun sample/ klasöründe — oyunlar ve mağaza tarzı UI'lar dahil eksiksiz uygulamalar.
Hangi .NET sürümleri destekleniyor? Güncel paket hattı .NET 10 (MAUI 10) hedefler; proje şablonu --netMajor ile .NET 9 veya 10 iskeleti kurabilir.