WPF и внедрение зависимостей - не удается найти ресурс - PullRequest
0 голосов
/ 12 мая 2018

Я пытался искать это без радости, поэтому извиняюсь, если что-то пропустил.

У меня 2 проекта; ViewModels и Views. Представления ссылаются на ViewModels и служат корнем композиции.

Я хочу, чтобы App.xaml.cs создавал экземпляр 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.

Я предполагаю, что из-за того, что я вручную устанавливаю MainWindow в методе OnStartup (), у класса MainWindow не установлен родительский параметр App? В результате среда выполнения не может разрешить «{StaticResource ButtonStyle}» для кнопки.

Как использовать контейнер IoC для создания представления (MainWindow.xaml), которое связывается со статическим ресурсом в App.xaml?

1 Ответ

0 голосов
/ 12 мая 2018

Я нашел решение, которое, кажется, работает. Сначала я зарегистрировался на событие запуска в App.xaml примерно так:

<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.

Примечание: переопределение OnStartup () в App.xaml.cs не работает.

...