23-го февраля, видимо в качестве праздничного подарка, был выпущен релиз Composite Application Block, который поддерживает WPF. Ура!
Пока создатели SmartClient Software Factory грозятся выпустить в конце апреля новую версию их продукта, которая будет содержать инструменты для добавления View, использующих WPF (и еще нескольких новых фич), CAB с поддержкой WPF можно скачать здесь: http://www.codeplex.com/wpfcab
Для работы с ним нужно:
- Создать "пустой" WPF-проект.
- Удалить Window1.xaml и выкинуть из файла App.xaml упоминания о нем.
- Добавить в заголовок App.xml следующее указание неймспейса:
xmlns:cab="clr-namespace:Microsoft.Practices.CompositeUI.Windows.Workspaces;assembly=Microsoft.Practices.CompositeUI.Windows"
- Создать в нем класс-аппликейшн, например ShellApplication, который унаследовать от ApplicationShellApplication<MainWorkItem, App>. Здесь MainWorkItem - это "главный" воркайтем приложения, а App - это класс, который уже есть в Вашем проекте и описывается файлами App.xaml и App.xaml.cs
- Создать класс Program (имя может быть любым), в котором определить статический метод Main так, как это делается в "обычном" WinForms-приложении. Запустить в нем созданный в п.2 класс-аппликейшн:
new ShellApplication().Run();
- Установить класс Program как стартовый класс в свойствах приложения.
Все, проект WPF CAB готов. Дальше все как обычно, кроме того, что вместо WinForms можно использовать WPF для создания View.
Кстати, если сейчас запустить приложение, то у него даже не будет окна. Для того, чтобы исправить этот "недостаток", нужно создать новую WPF-форму с именем, скажем, ShellWinfow.xaml и переопределить известный метод в ShellApplication:
protected override void AfterShellCreated()
{
base.AfterShellCreated();
ShellWindow mainWindow = RootWorkItem.Items.AddNew<ShellWindow>();
Shell.MainWindow = mainWindow;
mainWindow.Show();
}
Ну и еще одна "фича". В тех элементах, где планируется использование воркспейсов (DeckWorkspace, TabWorkspace, etc), в заголовок можно добавить следующий атрибут: xmlns:cab="http://schemas.microsoft.com/cab/wpf"
Это позволит потом определять воркспейсы в XAML-файле следующим образом:
<cab:DeckWorkspace x:Name="headerWorkspace"/>
В остальном работа с CAB не изменилась.
Более подробно можно посмотреть в примере (BankShell), который теперь тоже "переведен" на CAB WPF.