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)?
Odpowiedzi:
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 przezControl.DefaultStyleKey
wł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.OverrideMetadata
w 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.źródło
Aby
generic.xaml
plik (bez rozróżniania wielkości liter) był czymś wyjątkowym, muszą być spełnione dwa warunki:ThemeInfoAttribute
(zwykle wAssemblyInfo.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.
źródło
x:Key
pisząc<Button Style="{StaticResource MyButtonStyle}" />
? Co się stanie, jeśli ResourceDictionary zawiera więcej niż jeden Style, których TargetType to „Button”? Dzięki.h1 {color:#00ff00}
?