Search code examples
c#wpfxamlmvvmresourcedictionary

App.OnExit no suitable method found to override when adding ResourceDirectory


I've came across this error, which I couldn't find the solution for. I'm implementing an mvvm application and in main window I'm setting the main DataContext in xaml using a loader: in App.xaml:

<Application.Resources>
       <viewModel:KinectViewModelLoader x:Key="KinectViewModelLoader"/>
</Application.Resources>

In MainWindow.xaml:

<Window x:Class="KinectFittingRoom.MainWindow"
...
        DataContext="{Binding KinectViewModel, Source={StaticResource KinectViewModelLoader}}">
...
</Window>

Everything was running well, but now I wanted to add some dynamic resources, so I've created some xaml files containing styles and other elements. In example:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ModelUIElement3D x:Key="BirthdayHatModel">
...
    </ModelUIElement3D>
</ResourceDictionary >

To use them in MainWindow.xaml I've added them to App.xaml file as ResourceDirectory and then my application began to crash.

App.xaml:

<Application x:Class="KinectFittingRoom.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:viewModel="clr-namespace:KinectFittingRoom.ViewModel"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <viewModel:KinectViewModelLoader x:Key="KinectViewModelLoader"/>
        <ResourceDictionary x:Key="ResourceDictionary">
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Resources/Styles/GlassButton.xaml"/>
                <ResourceDictionary Source="Resources/Models/BirthdayHat.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

And now I'm getting an error on App.xaml.cs file saying that KinectFittingRoom.App.OnExit(System.Windows.ExitEventArgs) has no suitable method to override.

My overriden method:

protected override void OnExit(ExitEventArgs e)
{
    KinectViewModelLoader.Cleanup();
    base.OnExit(e);
}

Mabe someone could explain to me why adding ResourceDirectory node causes my application to throw an error? What can I do to include those resources and avoid such problem? I would appreciate any advice.


Solution

  • I think you need to change two things in your XAML:

    1. In your App.xaml file Move the declaration of your ViewModel inside ResourceDictionary section. Also if possible you should delete x:Key="ResourceDictionary". So now your App.xaml should look like:

      <Application x:Class..................>
          <Application.Resources>
              <ResourceDictionary>
                  <viewModel:KinectViewModelLoader x:Key="KinectViewModelLoader"/>
                  <ResourceDictionary.MergedDictionaries>
                      <ResourceDictionary Source="Resources/Styles/GlassButton.xaml"/>
                      <ResourceDictionary Source="Resources/Models/BirthdayHat.xaml"/>
                  </ResourceDictionary.MergedDictionaries>
              </ResourceDictionary>
          </Application.Resources>
      </Application>
      
    2. If after following the above step your program does not work then please follow this step along. Change the DataContext Property of your window like the code shown below:

      <Window x:Class="KinectFittingRoom.MainWindow"
              DataContext="{StaticResource KinectViewModelLoader}">
          ...
      </Window>
      
    3. If still your application does not work then change the order of the lines in App.OnExit() as follows:

      protected override void OnExit(ExitEventArgs e)
      {
          base.OnExit(e);
          KinectViewModelLoader.Cleanup();
      }