我试图在没有喜悦的情况下寻找这个,所以如果我在某个地方错过它就道歉。
我有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)?
答案 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()并不起作用。