<EnableDefaultItems>false</EnableDefaultItems> along with
<Compile Include="**\*.cs" Exclude="obj\**" /> and <None Remove="**\*.cs" />
is needed, though.
Annoyingly we need to have two separate projects in two separate directories,
since Framework WPF projects aren't supported in sdk-style csprojs. The
Framework and Core projects also stamp over each others' bin and obj
directories, even if you set IntermediateFilePath, hence the need to put
them in entirely separate places
It turns out there was a lovely little race with View.ActionTarget, where
either the View.ActionTarget or the corresponding {s:Action} could be
evaluated first. This meant setting View.ActionTarget was risky.
It happened to work in previous releases because the bootstrapper accessed
View.ViewManager, which caused its class ctor to run and somehow caused
View.ActionTarget to be evaluated earlier.
I don't think there's a decent way of getting around this: we can't
guarentee the order in which things in Xaml are going to be evaluated.
That's not the WPF way.
Therefore, only throw exceptions if someone actually clicks the button.
Having it as an extension method is good architecturally, but make it harder
to change its behaviour. This way, users can override it easily if they wish.
This also means that the WindowManager does not depend on the IoC service
locator, insteady accepting a Func<IMessageBoxViewModel>