Ответ 1
С Caliburn.Micro 2 и Mahapps.Metro 1 выше уже не является допустимой комбинацией двух фреймворков.
После некоторых исследований в документах Caliburn.Micro и последующих руководств по датам я придумал следующее.
Сначала создайте bootstrapper следующим образом:
public class AppBootstrapper : BootstrapperBase
{
private CompositionContainer container;
public AppBootstrapper()
{
Initialize();
}
protected override void Configure()
{
container = new CompositionContainer(
new AggregateCatalog(
AssemblySource.Instance.Select(
x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
)
);
CompositionBatch batch = new CompositionBatch();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(container);
container.Compose(batch);
}
protected override object GetInstance(Type service, string key)
{
string contract = string.IsNullOrEmpty(key) ? AttributedModelServices.GetContractName(service) : key;
var exports = container.GetExportedValues<object>(contract);
if(exports.Any())
{
return exports.First();
}
throw new Exception(string.Format("Could not locate any instances of contract {0}.", contract));
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetExportedValues<object>(AttributedModelServices.GetContractName(service));
}
protected override void BuildUp(object instance)
{
container.SatisfyImportsOnce(instance);
}
protected override void OnStartup(object sender, StartupEventArgs e)
{
DisplayRootViewFor<IShell>();
}
}
Затем добавьте bootstrapper в файл App.xaml вместе с ресурсами MahApps.Metro, например:
<Application x:Class="your-namespace.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:your-namespace">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<local:AppBootstrapper x:Key="bootstrapper" />
</ResourceDictionary>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Следующий шаг - убедиться, что у вашего ShellViewModel есть правильный экспорт (это простые требования для настройки mef bootstrapper, а не забудьте создать класс IShell (не указывая, что здесь, поскольку он стандартный )) так:
[Export(typeof(IShell))]
public class ShellViewModel : PropertyChangedBase, IShell
{
}
И наконец, нам нужно настроить ShellView для использования окна MahApps.Metro:
<Controls:MetroWindow x:Class="your-namespace.ShellView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro">
<Grid Background="White">
<TextBlock Text="Hello Caliburn Micro!"
VerticalAlignment="Center"
HorizontalAlignment="Center"
FontSize="20" />
</Grid>
</Controls:MetroWindow>
Надеюсь, это поможет любому, кто хочет совместить Caliburn.Micro и MahApps.Metro в своих последних итерациях.