Co jest takiego specjalnego w Generic.xaml?

153

Próbowałem dowiedzieć się, jak zorganizować moje pliki ResourceDictionary do ponownego wykorzystania i udostępniania innym członkom mojego zespołu.

Ciągle napotykam „Generic.xaml”, ale jeśli szukam w witrynie MSDN Generic.xaml lub po prostu wyszukuję w Google, wydaje mi się, że dostaję tylko posty na blogu i pytania na forum, które akurat o tym wspominają - nie mogę trafić na coś naprawdę autorytatywnego i jasnego.

Jaka jest różnica między Generic.xaml i MyRandomlyNamedResourceDictionary.xaml? Wygląda na to, że tak czy inaczej, muszę odwoływać się do ResourceDictionaries przechowywanych w bibliotekach z atrybutem Source. Na przykład,:

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

Więc jaką dokładnie korzyść zapewnia Generic.xaml? Czy ma to jakiś cel, jeśli nie próbuję nadać mojej aplikacji wielu „wyglądów” (tj. Jeśli mam tylko jeden motyw)?

devuxer
źródło
6
Nie musisz scalać słownika generic.xaml z kodem, jeśli używasz go z niestandardowymi kontrolkami (w przeciwieństwie do kontrolek użytkownika).
Eternal21

Odpowiedzi:

152

Każda kontrolka w WPF ma domyślny styl, który zapewnia między innymi domyślną kontrolkę ControlTemplate. WPF wyszukuje domyślny styl w specjalnym słowniku zasobów w folderze Themes w tym samym zestawie co formant. Klucz dla stylu domyślnego jest dostarczany przez Control.DefaultStyleKeywłaściwość zależności, której wartość domyślna jest zastępowana w każdej podklasie Control.

Nazwa słownika zasobów zależy od aktualnego motywu Windows, np. Na Vista z motywem Aero, słownik nazywa się Aero.NormalColor.xaml, na XP używającym domyślnego motywu jest to Luna.NormalColor.xaml. Jeśli styl nie jest znaleziony w słowniku motywów, szuka w Generic.xaml, czyli kontrolek, których wygląd nie zależy od motywu.

Dotyczy to tylko dowolnych niestandardowych kontrolek, które zdefiniowałeś, tj. Klas pochodzących od Control, bezpośrednio lub pośrednio. Możesz zmienić domyślny styl dla standardowej kontrolki, wyprowadzając ją z niej i wywołując DefaultStyleKeyProperty.OverrideMetadataw konstruktorze statycznym, ale następnie musisz podać pełny styl, w tym ControlTemplate.

Zauważ, że możesz powiedzieć WPF, aby szukał w zestawie zewnętrznym domyślnego stylu przy użyciu atrybutu ThemeInfo. Zestaw zewnętrzny musi mieć nazwę <YourAssembly >. <ThemeName >.dll, np. PresententationFramework.Aero.dll.

Phil Devaney
źródło
Dzięki, Phil. Więc czy mówisz, że gdybym chciał tylko dostarczyć nowy ControlTemplate dla normalnej kontrolki Button (tj. Nie pisać własnej specjalnej klasy, która pochodzi od Button), nie byłoby to uważane za część „motywu”?
devuxer
Tak, jeśli chcesz po prostu zmienić szablon lub zmienić styl standardowej kontrolki, użyj normalnego elementu zasobów na poziomie UserControl / Window / Application / Cokolwiek. Możesz użyć stylu z niejawnym kluczem ( msdn.microsoft.com/en-us/library/… ), aby zmienić wszystkie kontrolki określonego typu.
Phil Devaney
@Zaheylu Już działa (myślę, że MS aktualizowało swoje dokumenty)
Alan McBee - MSFT
104

Aby generic.xamlplik (bez rozróżniania wielkości liter) był czymś wyjątkowym, muszą być spełnione dwa warunki:

  • Musi znajdować się w folderze głównym Themes w projekcie
  • Zespół musi być oznaczony ThemeInfoAttribute(zwykle w AssemblyInfo.cs)

Następnie służy jako domyślna lokalizacja wyszukiwania dla wszystkich domyślnych stylów, które chcesz zastosować do swoich formantów. Należy również zauważyć, że aby styl był domyślny, musi zadeklarować zarówno swój TargetType, jak i x: Key jako typ kontroli, który ma być stylizowany.

Jeśli chcesz dodać całe motywy i przełączanie motywów do aplikacji, co odbywa się za pomocą pewnego kodowania, ta technika definiuje jedynie domyślny słownik zasobów.

Kenan EK
źródło
3
Czy możesz wyjaśnić, co rozumiesz przez „style domyślne”? Czy to oznacza, że ​​wszystkie przyciski automatycznie przyjmą styl, którego TargetType to „Button”? Czy nadal muszę odwoływać się x:Keypisząc <Button Style="{StaticResource MyButtonStyle}" />? Co się stanie, jeśli ResourceDictionary zawiera więcej niż jeden Style, których TargetType to „Button”? Dzięki.
devuxer
3
Jeszcze jedno pytanie, które pomoże mi to zrozumieć: czy Generic.xaml jest odpowiednikiem WPF pliku CSS, który definiuje domyślny wygląd różnych elementów, np. h1 {color:#00ff00}?
devuxer
3
Tak, domyślny styl byłby stosowany bez jawnego odwoływania się do klucza, a dwa identyczne style spowodowałyby błąd, że w słowniku są dwa identyczne klucze. I tak, możesz o tym myśleć w ten sposób, jeśli chodzi o domyślne zachowanie.
Kenan EK
3
Chciałem tylko dodać, że chociaż prawdą jest, że istnieją specjalne ograniczenia dotyczące samego pliku generic.xaml, hasło słownikowe w generic.xaml może być słownikiem scalonym, którego wpisy mogą odnosić się do wszystkiego.
Tormod,