Generic.xaml hakkında bu kadar özel olan nedir?


153

ResourceDictionary dosyalarımın yeniden kullanılması ve ekibimin diğer üyeleriyle paylaşılması için nasıl düzenleneceğini anlamaya çalışıyorum.

"Generic.xaml" ile karşılaşmaya devam ediyorum, ancak MSDN için Generic.xaml için bakarsam veya sadece bir Google araması yaparsam, sadece blog gönderileri ve forum soruları alıyorum. gerçekten güvenilir ve açık bir şeye çarptı.

Generic.xaml ve MyRandomlyNamedResourceDictionary.xaml arasındaki fark nedir? Her iki şekilde de görünüyor, Kaynak özniteliği ile kütüphanelerde depolanan ResourceDictionaries başvurmak zorunda. Örneğin,:

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>

Peki Generic.xaml tam olarak hangi avantajı sağlıyor? Uygulamama birden fazla "görünüm" (yani yalnızca bir temam varsa) vermeye çalışmıyorsam herhangi bir amacı var mı?


6
Özel denetimlerle (kullanıcı denetimlerinin aksine) kullanıyorsanız, generic.xaml sözlüğünde kodunuzla birleştirmeniz gerekmez.
Ebedi21

Yanıtlar:


152

WPF'deki her Denetim, diğer şeylerin yanı sıra Denetimin varsayılan değerini sağlayan varsayılan bir Stile sahiptir ControlTemplate . WPF, denetim ile aynı derlemedeki Temalar klasöründeki özel kaynak sözlüğünde varsayılan stili arar. Varsayılan stilin anahtarı Control.DefaultStyleKey, varsayılan değeri her Denetim alt sınıfında geçersiz kılınan bağımlılık özelliği tarafından sağlanır .

Kaynak sözlüğün adı geçerli Windows temasına bağlıdır, örneğin Aero temasını kullanan Vista'da, sözlük Aero.NormalColor.xaml olarak adlandırılır, XP'de varsayılan tema olan Luna.NormalColor.xaml'dir. Stil tema sözlüğünde bulunmazsa, Generic.xaml'de, yani görünümü temaya bağlı olmayan denetimler için bakar.

Bu sadece tanımladığınız özel kontroller için geçerlidir, yani doğrudan veya dolaylı olarak Control'dan türetilen sınıflar. Standart bir denetimin varsayılan stilini, denetimden türetip çağırarak değiştirebilirsiniz.DefaultStyleKeyProperty.OverrideMetadata statik , ancak daha sonra ControlTemplate dahil olmak üzere tam stili sağlamanız gerekir.

ThemeInfo özniteliğini kullanarak WPF'ye varsayılan stiliniz için harici bir montajda bakmasını söyleyebileceğinizi unutmayın. Harici montaj, <Montajınız olarak adlandırılmalıdır >. <ThemeName >.dll örneğin PresententationFramework.Aero.dll.


Teşekkürler Phil. Yani, normal bir Düğme kontrolü için yeni bir ControlTemplate sağlamak istersem (yani, Button'dan türeyen kendi özel sınıfımı yazmazsam), bunun bir "temanın" parçası olarak kabul edilmeyeceğini mi söylüyorsunuz?
devuxer

Evet, yalnızca standart bir denetimi yeniden şablonlamak veya yeniden biçimlendirmek istiyorsanız, UserControl / Window / Application / Whatever düzeyindeki normal Kaynaklar öğesini kullanırsınız. Belirli bir türdeki tüm denetimleri değiştirmek için örtük anahtarlı bir stil ( msdn.microsoft.com/en-us/library/… ) kullanabilirsiniz.
Phil Devaney

@Zaheylu Şimdi çalışıyor (Bence MS dokümanlarını güncelliyor)
Alan McBee - MSFT

104

Bir generic.xamldosyanın (büyük / küçük harf duyarsız) özel bir şey olması için iki koşulun karşılanması gerekir:

  • Projedeki Temalar alt kök klasöründe olmalıdır
  • Montaj ThemeInfoAttribute(genellikle içinde AssemblyInfo.cs) ile işaretlenmelidir.

Ardından, Denetimlerinize uygulamak istediğiniz varsayılan stiller için varsayılan arama konumu olarak işlev görür. Bir stilin varsayılan olması için, stilin Kontrol Türü olarak hem TargetType hem de x: Anahtarını bildirmesi gerektiğini unutmayın.

Uygulamanıza tüm temaları ve tema geçişini eklemek istiyorsanız, bu bazı kodlamalarla gerçekleştirilir, bu teknik yalnızca varsayılan kaynak sözlüğünü tanımlar.


3
Ne demek istediğinizi "varsayılan stiller" ile netleştirebilir misiniz? Bu, tüm düğmelerin TargetType "Button" olan bir stili otomatik olarak alacağı anlamına mı geliyor? Yoksa hala x:Keyyazarak başvurmam gerekiyor <Button Style="{StaticResource MyButtonStyle}" />mu? ResourceDictionary TargetType "Düğme" olan birden fazla Stil içeriyorsa ne olur? Teşekkürler.
devuxer

3
Kafamı bulamamda bana yardımcı olacak başka bir soru: Generic.xaml, farklı öğelerin varsayılan görünümünü tanımlayan bir CSS dosyasının WPF eşdeğeri, örneğin h1 {color:#00ff00}?
devuxer

3
Evet, varsayılan stil, anahtara açıkça başvurulmadan uygulanır ve iki özdeş stil, sözlükte iki özdeş anahtar olduğu hatasını verir. Ve evet, varsayılan davranışla ilgili olarak bu şekilde düşünebilirsiniz.
Kenan EK

3
Sadece şunu eklemek istedim, generic.xaml dosyasının kendisinde özel kısıtlamalar olmasına rağmen, generic.xaml içindeki sözlük girişi, girişleri herhangi bir şeye başvurabilecek birleştirilmiş bir sözlük olabilir.
Tormod
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.