WPF Merged ResourceDictionary с ресурсом, который привязывается к ресурсу в другом словаре, не работает

Я создал простой проект, который демонстрирует проблему, с которой у меня возникает ошибка: "Укажите значение" System.Windows.Markup.StaticResourceHolder "вызвала исключение". Номер строки "6" и позиция "9".

Макет проекта очень прост, и я загрузил его в Dropbox: https://www.dropbox.com/s/451b5zkw8oqgcld/StyleTest1.zip?dl=0

MainWindow.xaml

<Window x:Class="StyleTest1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary1.xaml" />
                <ResourceDictionary Source="Dictionary2.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
                <Setter Property="Background" Value="{DynamicResource Button.Static.Background}"/>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Style="{DynamicResource ButtonStyle1}">

        </Button>
    </Grid>
</Window>

Dictionary1.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:po="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <GradientStopCollection po:Freeze="true" x:Key="ButtonBackgroundStops">
        <GradientStop Color="#2d2d2f"/>
        <GradientStop Color="#2d2d2f" Offset="1"/>
    </GradientStopCollection>

    <LinearGradientBrush
        po:Freeze="true"    
        x:Key="ButtonBackgroundBrush"           
        GradientStops="{StaticResource ButtonBackgroundStops}"  
        StartPoint="0.5,-0.05"  
        EndPoint="0.5,0.66" />

</ResourceDictionary>

Dictionary2.xaml

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

    <LinearGradientBrush 
        x:Key="Button.Static.Background" 
        GradientStops="{Binding Source={StaticResource ButtonBackgroundBrush}, Path=GradientStops}" 
        StartPoint="{Binding Source={StaticResource ButtonBackgroundBrush}, Path=StartPoint}" 
        EndPoint="{Binding Source={StaticResource ButtonBackgroundBrush}, Path=EndPoint}"/>

</ResourceDictionary>

И это все... если я запускаю эту программу, я получаю сообщение об ошибке: "Укажите значение для" System.Windows.Markup.StaticResourceHolder ", вызвавшее исключение". Номер строки "6" и позиция "9".

Однако, если я изменил MainWindow.xaml на следующее, я больше не получу проблему: Вот ссылка на Dropbox для измененной версии: https://www.dropbox.com/s/ceikh5b8cfecdkw/StyleTest2.zip?dl=0

MainWindow.xaml

<Window x:Class="StyleTest2.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:StyleTest2"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary1.xaml" />
                <ResourceDictionary Source="Dictionary2.xaml" />
            </ResourceDictionary.MergedDictionaries>
            <LinearGradientBrush 
                x:Key="Button.Static.Background" 
                GradientStops="{Binding Source={StaticResource ButtonBackgroundBrush}, Path=GradientStops}" 
                StartPoint="{Binding Source={StaticResource ButtonBackgroundBrush}, Path=StartPoint}" />
            <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
                <Setter Property="Background" Value="{DynamicResource Button.Static.Background}"/>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Style="{DynamicResource ButtonStyle1}">

        </Button>
    </Grid>
</Window>

Можно предположить, что это проблема с привязкой LinearGradientBrush в Dictionary2.xaml к ресурсу ButtonBackgroundBrush, который находится в Dictionary1.xaml.

Может кто-нибудь сказать мне, что я делаю здесь неправильно и как правильно сделать так, чтобы ресурс в одном словаре ссылался на ресурс в другом словаре?

Спасибо за ваше время,

codeOwl

1 ответ

Решение
  1. использование DynamicResource на месте StaticResource в словаре2,

    или же

  2. Объедините словарь 1 в Dictionary2, тогда проблем не будет.

Dictionary2 будет выглядеть так:

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

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Dictionary1.xaml"/>
    </ResourceDictionary.MergedDictionaries>

    <LinearGradientBrush 
        x:Key="Button.Static.Background" 
        GradientStops="{Binding Source={StaticResource ButtonBackgroundBrush}, Path=GradientStops}" 
        StartPoint="{Binding Source={StaticResource ButtonBackgroundBrush}, Path=StartPoint}" 
        EndPoint="{Binding Source={StaticResource ButtonBackgroundBrush}, Path=EndPoint}"/>

</ResourceDictionary>
Другие вопросы по тегам