Это "просто"!
Я только что натолкнулся на это сообщение в блоге Руди Гроблера , в котором говорится, что "легко" перенести тему из Silverlight в WPF. К сожалению, он не говорит, как это сделать.
Скачать и установить
Я установил WPF Toolkit и Silverlight Toolkit из Codeplex.
Я также пошел и выкопал исходный код интересующей меня темы (BureauBlue) (предупреждение, загрузка занимает немного времени) и вставил его в новый файл словаря ресурсов. в моем тестовом проекте.
Ut о, битые ссылки
Много синих волнистых линий.
альтернативный текст http://img32.imageshack.us/img32/6032/brokenreferences.jpg
Нет ссылок здесь
Итак, я пошел, чтобы добавить ссылки и обнаружил ... их нет в списке.
альтернативный текст http://img35.imageshack.us/img35/7466/addreferencedialog.jpg
Ааа, вот они
К счастью, я смог найти их после продолжительного просмотра .
альтернативный текст http://img269.imageshack.us/img269/3830/addreferencedialogbrows.jpg
И вот я их добавил
Найдя недостающие ссылки, я попытался добавить их. Это на самом деле, казалось, разрешало неработающие ссылки xmlns
(по крайней мере синие волнистые линии исчезли), но когда я строил свой проект, я получил ошибку:
Ошибка 1 Неизвестная ошибка сборки, «Не удается разрешить зависимость от сборки» System.Windows, Версия = 2.0.5.0, Культура = нейтральная, PublicKeyToken = 7cec85d7bea7798e ', поскольку она не была предварительно загружена. При использовании API ReflectionOnly зависимые сборки должны быть предварительно загружены или загружены по требованию через событие ReflectionOnlyAssemblyResolve. ' NmtConcept
И, поэтому я спрашиваю ...
Как заставить тему Silverlight работать в WPF?
Обновление!
Ну, я думал, что понял это. Я решил начать с DataGrid
. Я выяснил, какие были все эквиваленты WPF для сборок Silverlight, и я фактически получил свой проект для компиляции и запуска. И тогда я увидел результат ...
альтернативный текст http://img44.imageshack.us/img44/2418/porteddatagrid.jpg
Заголовок несколько правильный (за исключением отсутствующих стрелок сортировки), но остальная часть выглядит так, как будто произошла какая-то ужасная авария с кирпичами коричневого цвета.
Вот пример на веб-странице Silverlight Toolkit .
альтернативный текст http://img196.imageshack.us/img196/997/silverlightdatagrid.jpg
Итак, я даже близко не подошел.
Что я сделал
Пожалуйста, позвольте мне объяснить, что я сделал, чтобы прийти к этому беспорядку.
DataGridFrozenGrid
Сначала мне пришлось взять DataGridFrozenGrid
с этой исходной кодовой страницы Silverlight Toolkit , потому что WPF никогда не слышал о таком классе.
BureauBlue
Затем я вставил в ключи из исходный код BureauBlue (опять же, предупреждение: этот ребенок загружается медленно).
Под ключевыми фигурами , я имею в виду:
- Все ресурсы кисти в начале файла плюс
Style
для каждого из этих элементов управления:
- DataGridColumnHeader
- DataGridCell
- DataGridRowHeader
- DataGridRow
Как ни странно, оригинальный файл не содержал стиля для самого DataGrid
(пожалуйста, исправьте меня, если я ошибаюсь, но я использовал Find и все).
Silverlight -> WPF
Затем я преобразовал ссылки xmlns
в эквиваленты WPF. Вот как получился мой элемент ResourceDictionary
:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mwc="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
xmlns:mwcp="clr-namespace:Microsoft.Windows.Controls.Primitives;assembly=WPFToolkit"
xmlns:swcp="clr-namespace:System.Windows.Controls.Primitives;assembly=CommonLibraryWpf"
xmlns:sw="clr-namespace:System.Windows;assembly=WPFToolkit">
Я, конечно, отредактировал теги пространства имен для соответствия.
Редактировать, пока не заработает
Как только у меня все это заработало, у меня все еще было несколько мелких проблем. В некоторых элементах x:Name
были пробелы. Компилятор не допустит этого, поэтому мне пришлось заменить пробелы подчеркиванием.
Вот соответствующие фрагменты:
<!-- Important: all underscores used to be spaces -->
<sw:VisualState
x:Name="MouseOver_CurrentRow_Selected">
<sw:VisualState
x:Name="Normal_CurrentRow">
<sw:VisualState
x:Name="Normal_Selected">
<sw:VisualState
x:Name="Normal_EditingRow">
<sw:VisualState
x:Name="Normal_AlternatingRow" />
<sw:VisualState
x:Name="Normal_Selected">
<sw:VisualState
x:Name="MouseOver_Selected">
<sw:VisualState
x:Name="Unfocused_Selected">
Изменение этих имен казалось очень плохой идеей - и может быть причиной всех моих проблем - но я не знал, что еще нужно сделать, чтобы заставить это скомпилироваться.
Другое изменение, которое мне пришлось сделать, было: некоторые элементы SolidColorBrush
и LinearGradientBrush
в начале использовали x:Name
вместо x:Key
. Я изменил их все на x:Key
. Возможно, это тоже была плохая идея, но опять же компилятор сделал меня.
Помогает ли это вам помочь?
Если после всего этого ты еще со мной, есть какие-нибудь предложения?