Що таке особливе в Generic.xaml?


153

Я намагався розібратися, як організувати свої файли ResourceDictionary для повторного використання та обміну з іншими членами моєї команди.

Я постійно натрапляю на "Generic.xaml", але якщо я дивлюся на MSDN для Generic.xaml або просто шукаю пошук у Google, мені здається, що я отримую лише повідомлення в блозі та питання на форумі, які трапляються згадувати про це - я не можу, здається, натрапити на що-небудь справді авторитетне та зрозуміле.

Яка різниця між Generic.xaml і MyRandomlyNamedResourceDictionary.xaml? Це здається в будь-якому випадку, я маю посилатися на ResourceDic Dictionary, що зберігаються в бібліотеках, з атрибутом Source. Наприклад,:

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

То яку перевагу надає Generic.xaml? Чи є якась мета, якщо я не намагаюся надати моєму додатку кілька "поглядів" (тобто, якщо у мене є лише одна тема)?


6
Вам не потрібно об’єднувати словник generic.xaml у свій код, якщо ви використовуєте його із спеціальними елементами управління (на відміну від елементів керування користувачами).
Вічний21

Відповіді:


152

Кожен елемент керування у WPF має Стиль за замовчуванням, який забезпечує, серед іншого, типовий елемент управління ControlTemplate. WPF шукає стиль за замовчуванням у спеціальному словнику ресурсів у папці «Теми» в тій же збірці, що і керування. Ключ для стилю за замовчуванням надається Control.DefaultStyleKeyвластивістю залежності, значення за замовчуванням якого переосмислюється в кожному підкласі управління.

Назва словника ресурсів залежить від поточної теми Windows, наприклад, на Vista, що використовує тему Aero, словник називається Aero.NormalColor.xaml, у XP, використовуючи тему за замовчуванням, це Luna.NormalColor.xaml. Якщо стиль не знайдено в словнику тем, він виглядає в Generic.xaml, тобто для елементів керування, вигляд яких не залежить від теми.

Це стосується лише визначених вами спеціальних елементів керування, тобто класів, похідних від Control, прямо чи опосередковано. Ви можете змінити стиль за замовчуванням для стандартного елемента керування, вивівши з нього та зателефонувавши DefaultStyleKeyProperty.OverrideMetadataв статичний конструктор, але тоді вам доведеться надати повний стиль, включаючи ControlTemplate.

Зауважте, що ви можете сказати WPF шукати у зовнішній збірці для вашого стилю за замовчуванням, використовуючи атрибут ThemeInfo. Зовнішня збірка повинна бути названа <YourAssembly >. <ThemeName >.dll, наприклад, PresententationFramework.Aero.dll.


Спасибі, Філ. Так ви кажете, що якби я просто хотів надати новий ControlTemplate для нормального керування кнопками (тобто не писати власний спеціальний клас, що походить від кнопки), це не вважалося б частиною "теми"?
devuxer

Так, якщо ви просто хочете повторно шаблонувати або переформатувати стандартний елемент керування, тоді ви використовуєте звичайний елемент Resources на UserControl / Window / Application / Незалежному рівні. Ви можете використовувати стиль із неявною клавішею ( msdn.microsoft.com/en-us/library/… ), щоб змінити всі елементи керування певного типу.
Філ Девані

@Zaheylu Це працює зараз (я думаю, що MS оновлював свої документи)
Алан Макбі - MSFT

104

Щоб generic.xamlфайл (нечутливий до регістру) був особливим, необхідно виконати дві умови:

  • Він повинен бути в підкореневій папці "Теми" в проекті
  • Збірка повинна бути позначена символом ThemeInfoAttribute(як правило, в AssemblyInfo.cs)

Тоді воно служить місцем пошуку за замовчуванням для будь-яких стилів за замовчуванням, які ви хочете застосувати до своїх елементів керування. Зауважте також, що для стилю, який є типовим, він повинен оголошувати і його TargetType, і x: Key як тип управління, який повинен бути стилізований.

Якщо ви хочете додати до своєї програми цілі теми та перемикання тем, що здійснюється за допомогою деякого кодування, ця методика лише визначає словник ресурсів за замовчуванням.


3
Чи можете ви уточнити, що ви маєте на увазі під «стилями за замовчуванням»? Чи означає це, що всі кнопки автоматично набиратимуть стиль, TargetType - "Кнопка"? Або мені все-таки потрібно посилатися на це x:Keyв письмовій формі <Button Style="{StaticResource MyButtonStyle}" />? Що станеться, якщо ResourceDictionary містить більше одного стилю, для якого TargetType є "Кнопка"? Дякую.
devuxer

3
Ще одне запитання, яке допоможе мені вирішити це питання: чи Generic.xaml є WPF-еквівалентом файлу CSS, який визначав зовнішній вигляд різних елементів, наприклад h1 {color:#00ff00},?
devuxer

3
Так, стиль за замовчуванням застосовуватиметься, не чітко посилаючись на ключ, а два однакові стилі дають помилку, що у словнику є дві однакові клавіші. І так, ви могли б подумати про це так, щодо поведінки за замовчуванням.
Кенан Е.К.

3
Просто хотів додати, що, хоча це правда, що для самого файлу generic.xaml існують спеціальні обмеження, запис словника в generic.xaml може бути об'єднаним словником, записи якого можуть посилатися на що завгодно.
Tormod
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.