Stillenebilir Denetimleri Tasarlama Yönergeleri
Bu belgede, kolayca ifade edilebilir ve geçici olarak tasarlanamayan bir denetim tasarlarken göz önünde olacak bir dizi en iyi uygulama özetlenmiştir. Yerleşik WPF denetim kümesi için tema denetim stilleri üzerinde çalışırken çok sayıda deneme ve hata aracılığıyla bu en iyi yöntemler kümesine geldik. Başarılı stilin, stilin kendisi kadar iyi tasarlanmış bir nesne modelinin de işlevi olduğunu öğrendik. Bu belgenin hedef kitlesi, stil yazarı değil denetim yazarıdır.
Terminoloji
"Stil oluşturma ve şablon oluşturma", denetim yazarının denetimin görsel yönlerini denetimin stiline ve şablonuna ertelemesini sağlayan teknoloji paketine başvurur. Bu teknoloji paketi şunları içerir:
Stiller (özellik ayarları, tetikleyiciler ve storyboard'lar dahil).
Kaynaklar.
Denetim şablonları.
Veri şablonları.
Stil ve templating'e giriş için bkz. Stil oluşturma ve oluşturma.
Başlamadan önce: Denetiminizi Anlama
Bu yönergelere başlamadan önce, denetiminizin genel kullanımını anlamak ve tanımlanmamış olmak önemlidir. Stil oluşturma çoğu zaman bir dizi olanak sağlar. Geniş bir şekilde kullanılacak şekilde yazılan denetimler (birçok uygulama, birçok geliştirici tarafından) denetimin görsel görünümü üzerinde çok kapsamlı değişiklikler yapmak için stil oluşturmanın kullanıla zor olmasıyla karşı karşıyadır. Aslında stile sahip denetim, denetim yazarının amacına bile benzemeyebilir. Stil tarafından sunulan esneklik temelde sınırsız olduğu için, kararlarınızı kapsamınıza alamanıza yardımcı olması için ortak kullanım fikri kullanabilirsiniz.
Denetiminizin yaygın kullanımını anlamak için denetimin değer önermesi hakkında düşünmek iyi bir fikirdir. Denetiminiz başka hiçbir denetimin sunamay olduğu tabloya ne getirir? Genel kullanım, belirli bir görsel görünümü değil, denetimin ve kullanımıyla ilgili makul bir beklenti kümesi anlayışını ifade ediyor. Bu anlayış, ortak durumda denetimin bileşim modeli ve stil tanımlı davranışları hakkında bazı varsayımlarda bulunabilirsiniz. Örneğin, örneğin, genel kullanımı anlamak belirli bir köşenin yuvarlak olup olmadığı hakkında size içgörüler vermese de, büyük olasılıkla bir açılır pencereye ihtiyaç olduğu ve açık olup olmadığını açmanın bir yolunun gerekip gerek olmadığı hakkında size içgörü ComboBoxComboBoxComboBox sağlar.
Genel Yönergeler
Şablon sözleşmelerini katı bir şekilde zorunlu kılınma. Denetimin şablon sözleşmesi öğelerden, komutlardan, bağlamalardan, tetikleyicilerden, hatta denetimin düzgün çalışması için gereken veya beklenen özellik ayarlarından oluşur.
Anlaşmaları mümkün olduğunca en aza indirme.
Tasarım zamanında (tasarım aracı kullanırken) denetim şablonunun eksik durumda olması yaygın bir durumdur. WPF bir "oluşturma" durum altyapısı sunmaz, bu nedenle denetimlerin böyle bir durum geçerli olabileceği beklentisiyle inşa edilmiş olması gerekir.
Şablon sözleşmesinin herhangi bir yönü izlenmay olduğunda özel durumlar oluşturma. Bu satırlarda, çok fazla veya çok az sayıda çocuk varsa paneller özel durumlar atamaz.
Çevresel işlevselliği şablon yardımcı öğelerine dahil edin. Her denetim, temel işlevselliğine ve gerçek değer teklifine odaklanarak denetimin ortak kullanımıyla tanımlanmalıdır. Bu amaçla, denetimin temel işlevselliğine katkıda bulunan çevresel davranışları ve görselleştirmeleri, yani bu davranışları ve görselleştirmeleri etkinleştirmek için şablon içindeki bileşimleri ve yardımcı öğeleri kullanın. Yardımcı öğeler üç kategoriye ayrılır:
Tek başına yardımcı türleri, şablonda "anonim olarak" kullanılan ortak ve yeniden kullanılabilir denetimler veya temel öğelerdir; yani yardımcı öğe veya stil denetimi diğerinin farkında değildir. Teknik olarak, herhangi bir öğe anonim bir tür olabilir, ancak bu bağlamda terimi hedeflenen senaryoları etkinleştirmek için özelleştirilmiş işlevselliği kapsüller bu türleri açıklar.
Tür tabanlı yardımcı öğeler, özelleştirilmiş işlevselliği kapsülleye yeni türlerdir. Bu öğeler genellikle ortak denetimlere veya temel öğelere göre daha dar bir işlev aralığıyla tasarlanmıştır. Tek başına yardımcı öğelerden farklı olarak, tür tabanlı yardımcı öğeler kullanıldıkları bağlamın farkındadır ve genellikle ait olduğu şablonun denetimiyle veri paylaşması gerekir.
Adlandırılmış yardımcı öğeler, bir denetimin şablon içinde adıyla bulmasını beklediğiniz ortak denetimler veya temel öğelerdir. Bu öğelere şablon içinde iyi bilinen bir ad verilir ve bu da denetimin öğeyi bulup program aracılığıyla etkileşim kurması için mümkün olur. Herhangi bir şablonda verilen adla yalnızca bir öğe olabilir.
Aşağıdaki tabloda, bugün denetim stilleri tarafından çalışan yardımcı öğeler (bu liste kapsamlı değildir) gösterir:
Öğe Tür Kullanan ContentPresenter Tür tabanlı Button, CheckBoxRadioButton , , ve gibi Frame (tüm ContentControl türler) ItemsPresenter Tür tabanlı ListBox, ComboBoxMenu , ve gibi (tüm ItemsControl türler) ToolBarOverflowPanel Adlı ToolBar Popup Tek Başına ComboBox, ToolBarMenu , , ve ToolTip gibi RepeatButton Adlı Slider, ScrollBar ve gibi ScrollBar Adlı ScrollViewer ScrollViewer Tek Başına ListBox, ComboBoxMenu , , ve Frame gibi TabPanel Tek Başına TabControl TextBox Adlı ComboBox TickBar Tür tabanlı Slider Yardımcı öğelerde gerekli kullanıcı tarafından belirtilen bağlamaları veya özellik ayarlarını en aza indirme. Bir yardımcı öğenin denetim şablonunda düzgün çalışması için belirli bağlamaları veya özellik ayarlarını gerektirmesi yaygın bir durumdur. Yardımcı öğe ve şablon denetimi mümkün olduğunca bu ayarları oluşturmalı. Özellikleri ayarlarken veya bağlamalar kurulurken, kullanıcı tarafından ayarlanmış değerleri geçersiz kılmama özeni gerekir. Belirli en iyi yöntemler şunlardır:
Adlandırılmış yardımcı öğeleri üst öğe tarafından tanım olmalı ve üst öğe yardımcı öğede gerekli ayarları kurarak.
Tür tabanlı yardımcı öğeler, gerekli ayarları doğrudan kendileri kurmalı. Bunu yapmak için yardımcı öğenin , (içinde kullanılan şablonun denetim türü) dahil olmak üzere, içinde kullanılan bilgi bağlamını
TemplatedParentsorgulamasını gerekli olabilir. Örneğin, ContentPresenter türetilmiş birContenttürde kullanılırken özelliğiniTemplatedParentotomatik Content olarak özelliğine ContentControl bağlar.Tanım gereği ne yardımcı öğe ne de üst öğe diğer öğeyi bildiği için tek başına yardımcı öğeler bu şekilde iyiilemez.
Bir şablon içindeki öğeleri bayrakla bayrakla oluşturmak için Name özelliğini kullanın. Program aracılığıyla erişmek için stilinde bir öğeyi bulması gereken bir denetim, özelliğini ve
Nameparadigmasını kullanarak bunuFindNameyapmalı. Bir öğe bulunamasa bir denetim özel durum oluşturur, ancak bu öğeyi gerekli olan işlevselliği sessizce ve sessizce devre dışı bırakmanız gerekir.Stilde denetim durumunu ve davranışını ifade etmek için en iyi yöntemleri kullanın. Aşağıda, bir stilde denetim durumu değişikliklerini ve davranışını ifade etmek için en iyi yöntemlerin sıralı bir listesi yer almaktadır. Senaryoyu sağlayan listede ilk öğeyi kullanabilirsiniz.
Özellik bağlama. Örnek: ile arasında ComboBox.IsDropDownOpenToggleButton.IsChecked bağlama.
Tetiklenen özellik değişiklikleri veya özellik animasyonları. Örnek: bir 'nin üzerine gelme Button durumu.
Komut. Örnek: LineUpCommand / LineDownCommandScrollBar içinde.
Tek başına yardımcı öğeler. Örnek: TabPanelTabControl içinde.
Tür tabanlı yardımcı türleri. Örnek: ContentPresenterButton içinde, TickBarSlider içinde.
Adlandırılmış yardımcı öğeler. Örnek: TextBoxComboBox içinde.
Adlandırılmış yardımcı türlerden kabarcıklı olaylar. Kabarcıklı olayları bir stil öğesinden dinlersiniz, olayı üreten öğenin benzersiz olarak belirlenebilir olması gerekir. Örnek: ThumbToolBar içinde.
Özel
OnRenderdavranış. Örnek: ButtonChromeButton içinde.
Stil tetikleyicilerini (şablon tetikleyicileri yerine) sık kullanın. Şablonda öğelerin özelliklerini etkileyen tetikleyicilerin şablonda bildir olması gerekir. Şablonun değiştirilmesinin tetikleyiciyi de yok etme gerektiğini bilmiyorsanız, denetim özelliklerini etkileyen tetikleyiciler
TargetName(hayır) stilde bildirebilirsiniz.Mevcut stil desenleriyle tutarlı olun. Çoğu zaman bir sorunu çözmenin birden çok yolu vardır. Mevcut denetim stili desenlerini ve mümkün olduğunda tutarlı hale geldiğinden emin olun. Bu, özellikle aynı temel türden (örneğin, , , vb.) türeten ContentControlItemsControlRangeBase denetimler için önemlidir.
yeniden derlemeden ortak özelleştirme senaryolarını etkinleştirmek için özellikleri ortaya çıkarma. WPF takılabilir/özelleştirilebilir parçaları desteklemez, bu nedenle denetim kullanıcısı yalnızca iki özelleştirme yöntemiyle bırakılabilir: özellikleri doğrudan ayarlama veya stilleri kullanarak özellikleri ayarlama. Bu nedenle, çok yaygın, yüksek öncelikli özelleştirme senaryolarında hedeflenen sınırlı sayıda özelliğin ortaya çıkar ve aksi takdirde yeniden derlemenin gerekli olması uygundur. Özelleştirme senaryolarını ne zaman ve nasıl etkinleştirebilirsiniz? için en iyi yöntemler:
Çok yaygın özelleştirmeler denetimde özellikler olarak açık olmalı ve şablon tarafından tüketilmelidir.
Daha az yaygın (nadir de olsa) özelleştirmelerin ekli özellikler olarak açığa çıkar ve şablon tarafından tüketilmesi gerekir.
Bilinen ancak nadir özelleştirmelerin yeniden derleme gerektirmesi kabul edilebilir.
TemaYla Ilgili Dikkat Edilmesi Gerekenler
Tema stilleri tüm temalarda tutarlı özellik semantiğinesahip olmak için denemeli, ancak garantisi yoktur. Belgelerinin bir parçası olarak, denetiminizin denetimin özellik semantiği, yani bir denetimin özelliğinin "anlamı" açıklayan bir belgeye sahip olması gerekir. Örneğin, denetim ComboBox içindeki özelliğin anlamını BackgroundComboBox tanımlamalı. Denetiminiz için varsayılan stiller, tüm temalar genelinde bu belgede tanımlanan semantiği takip etmeye çalışmalı. Diğer taraftan denetim kullanıcıları, özellik semantiğinin temadan temaya değiştiğine dikkat etmektir. Belirli durumlarda, belirli bir özellik belirli bir temanın ihtiyaç duyduğu görsel kısıtlamaların altında ifade edilemez. (Örneğin Klasik tema, birçok denetim için uygulana tek
Thicknessbir kenarlıka sahip değildir.)Tema stillerinin tüm temalarda tutarlı tetikleyici semantiği olması gerekir. Tetikleyiciler veya animasyonlar aracılığıyla denetim stili tarafından ortaya çıkan davranış temadan temaya farklılık gösterebilir. Denetim kullanıcıları, bir denetimin tüm temalar genelinde belirli bir davranış elde etmek için aynı mekanizmayı zorunlu olarak çalıştırmayacaklarının farkındadır. Örneğin bir tema, başka bir temanın tetikleyici kullandığı üzerine gelme davranışını ifade etmek için bir animasyon kullanabilir. Bu, özelleştirilmiş denetimlerde davranış korumasında tutarsızlıklara neden olabilir. (Örneğin, arka plan özelliğini değiştirmek, bir tetikleyici kullanılarak ifade edildiyse denetimin üzerine gelme durumunu etkilemez. Ancak, üzerine gelme durumu bir animasyon kullanılarak uygulanırsa, arka plana geçiş, animasyonu geri ver şekilde bozarak durum geçişini geri alamdır.)
Tema stillerinin tüm temalarda tutarlı "düzen" semantiği olması gerekir. Örneğin, varsayılan stilin bir denetimin tüm temalarda aynı boyutta yer kaplaması veya bir denetimin tüm temalarda aynı içerik kenar boşluklarının/doldurmanın aynı boyutta olması garanti edilemez.