Как перенести тему из Silverlight в WPF? - PullRequest
7 голосов
/ 23 октября 2009

Это "просто"!

Я только что натолкнулся на это сообщение в блоге Руди Гроблера , в котором говорится, что "легко" перенести тему из 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 (опять же, предупреждение: этот ребенок загружается медленно).

Под ключевыми фигурами , я имею в виду:

  1. Все ресурсы кисти в начале файла плюс
  2. 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. Возможно, это тоже была плохая идея, но опять же компилятор сделал меня.


Помогает ли это вам помочь?

Если после всего этого ты еще со мной, есть какие-нибудь предложения?

Ответы [ 2 ]

2 голосов
/ 24 октября 2009

Я в основном пришел к выводу, что пытался вставить квадратный колышек в круглое отверстие (несмотря на утверждения, что это «легко»). Silverlight DataGrid слишком сильно отличается от WPF Toolkit DataGrid. Итак, на данный момент я просто пытаюсь стилизовать сетку данных по умолчанию, чтобы она выглядела как BureauBlue. Это довольно кропотливая работа и далеко не идеальная, но это определенное улучшение по сравнению с перенесенным стилем.

альтернативный текст http://img26.imageshack.us/img26/7163/styleddatagrid.jpg

1 голос
/ 23 октября 2009

Я полагаю, что неразрешенная ссылка относится к Silverlight-версии System.Windows.dll. Вам придется изменить ссылки в проекте темы, чтобы они указывали на версию DLL библиотеки WPF.

Вы также можете посмотреть на проект WPF themes (координируемый Руди Гроблером), в котором уже есть BureauBlue.

...