WPF和依赖注入 - 找不到资源

时间:2018-05-11 21:27:40

标签: c# wpf xaml dependency-injection ninject

我试图在没有喜悦的情况下寻找这个,所以如果我在某个地方错过它就道歉。

我有2个项目; ViewModels和Views。视图引用ViewModels并充当组合根。

我希望App.xaml.cs在views项目中实例化MainWindow.xaml,并将MainWindowViewModel绑定到它的'DataContext。到目前为止,平安无事。当MainWindow.xaml使用App.xaml中的静态资源时会发生此问题。

在App.xaml.cs中我有:

public partial class App : Application
{
    private StandardKernel container;

    protected override void OnStartup(StartupEventArgs e)
    {
        this.container = new StandardKernel();
        this.MainWindow = container.Get<MainWindow>();
    }
}

在App.xaml中我有:

<Application x:Class="TestApp.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:TestApp">
<Application.Resources>

    <Style x:Key="ButtonStyle" TargetType="Button">
        <Setter Property="Background" Value="Blue"/>
    </Style>
</Application.Resources>

在MainWindow.xaml中,我有:

<Window x:Class="TestApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:TestApp"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Button Style="{StaticResource ButtonStyle}">Test</Button>

运行应用程序时出现以下错误:

Exception: Cannot find resource named 'ButtonStyle'. Resource names are case sensitive.

我假设因为我在OnStartup()方法中手动设置MainWindow,MainWindow类没有将其父设置为App?因此,运行时无法解析按钮上的“{StaticResource ButtonStyle}”。

如何使用IoC容器构建绑定到App.xaml中的静态资源的View(MainWindow.xaml)?

1 个答案:

答案 0 :(得分:0)

我找到了似乎有效的解决方案。首先,我在App.xaml中注册了Startup事件,如下所示:

<Application x:Class="CompositionRoot.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:TestApp"
             Startup="App_OnStartup">
    <Application.Resources>
        <Style x:Key="ButtonStyle" TargetType="Button">
            <Setter Property="Background" Value="Blue"/>
        </Style>
    </Application.Resources>
</Application>

然后我在App.xaml.cs中添加了以下事件处理程序:

public partial class App : Application
{
    private StandardKernel container;

    private void App_OnStartup(object sender, StartupEventArgs e)
    {
        this.container = new StandardKernel();
        this.MainWindow = container.Get<MainWindow>();
        this.MainWindow.Show();
    }
}

之后,MainWindow能够在Application.Resource中找到该样式。

注意:在App.xaml.cs中覆盖OnStartup()并不起作用。