Свойство Resources пустое

112
05 января 2021, 22:30

Я создаю приложение wpf и у меня есть вот такие строчки кода:

public MainWindow()
{
    Background = (Brush)FindResource("Background");
}

Вот файл с окном:

<Window
        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:MyApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="800" Width="450" WindowStartupLocation="CenterScreen">
    <Window.Resources>
        <ResourceDictionary Source="Resources/MainWindow.xaml"/>
    </Window.Resources>
    <Grid>
    </Grid>
</Window>

А вот сам словарь:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:MyApp">
    <ImageBrush x:Key="Background" ImageSource="Sources/..."/>
</ResourceDictionary>

Мой фон не определяет. Т. е. изменения не применяются. Но если сделать вот так:

<Window
        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:MyApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="800" Width="450" WindowStartupLocation="CenterScreen"
        Background="{StaticResource Background}">
    <Window.Resources>
        <ResourceDictionary Source="Resources/MainWindow.xaml"/>
    </Window.Resources>
    <Grid>
    </Grid>
</Window>

то всё заработает. Как это пофиксить, чтоб работало и в коде, и в разметке. Когда отлаживал оказалось, что Count у свойства Resources равно нулю. Всё оч. странно.

Answer 1

Знаю два способа получения ресурсов в коде.

Первый:

var myResourceDictionary = new ResourceDictionary();
    myResourceDictionary.Source =
        new Uri("/DllName;component/MainWindow.xaml",
                UriKind.RelativeOrAbsolute);

А затем получить по имени:

myResourceDictionary["Background"] as ImageBrush 

Второй:

var imageBrush = (ImageBrush )Application.Current.FindResource("Background")

Второй способ подходит если вы используете один файл ресурсов в приложении.

А первый, если вы используете файл ресурсов в каком-то проекте один, а приложение использует другой файл ресурсов.

Answer 2

Нужно добавить InitializeComponent в MainWindow() и все заработало.

READ ALSO
ASP .NET Core 2 свойство навигации

ASP .NET Core 2 свойство навигации

Создал два класса со связью один к одному

93
Клонирование коллекций ICollection&lt;Element&gt;

Клонирование коллекций ICollection<Element>

Необходимо клонировать коллекцию так, чтобы все её объекты Element так же отвязались от исходной коллекцииПодскажите, как лучше всего это сделать?

134
Закрытие окна через usercontrol

Закрытие окна через usercontrol

Собственно вопросБыли мысли сделать подобное через relative source, но как это передать в код - не знаю

89