2016-03-06 3 views
0

J'ai créé un projet simple qui illustre le problème que j'obtiens où j'obtiens l'erreur: 'Fournir de la valeur sur' System.Windows.Markup.StaticResourceHolder ' a jeté une exception. Numéro de ligne '6' et position de ligne '9'.WPF a fusionné ResourceDictionary avec la ressource qui lie à la ressource dans un autre dictionnaire ne fonctionne pas

La mise en page du projet est très simple et je l'ai téléchargé à 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> 

Et c'est tout ... si j'exécute ce programme j'obtiens l'erreur: 'Fournir une valeur sur' System.Windows.Markup.StaticResourceHolder 'a généré une exception.' Numéro de ligne '6' et position de ligne '9'.

Cependant, si je modifie MainWindow.xaml à ce qui suit je ne reçois la question: Voici le lien pour la version dropbox modifiée: 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> 

qui suggérerait que c'est un problème avec la liaison LinearGradientBrush dans Dictionary2.xaml à la ressource ButtonBackgroundBrush qui se trouve dans Dictionary1.xaml.

Quelqu'un peut-il me dire ce que je fais mal ici et quelle est la bonne façon d'avoir une ressource dans un dictionnaire référencer une ressource dans un autre dictionnaire?

Merci pour votre temps,

codeOwl

+0

Pourquoi ne pas simplement combiner les deux Dictionary1.xaml et Dictionary2.xaml en un seul afin de résoudre le problème si cela est en effet une cause racine de celui-ci ? Cordialement, –

+0

Ceci est juste une démo pour reproduire le problème. En réalité, je crée un add-on pour un programme écrit en WPF et Dictionary1 est en fait l'habillage actuel de ce programme. Donc, pour tester, j'ai écrit une application WPF, tout comme la démo dans ce post où je fusionne dans leur dictionnaire de la peau de la même manière que je fusionne dans Dictionary1 dans la démo ... mais il ne fonctionne pas ... Je reçois le même erreur ... d'où ce post ... – user2109254

+0

S'il vous plaît affiner votre question à ce problème de programmation particulier et supprimer la partie descriptive trop large.Merci et salutations, –

Répondre

1
  1. Utilisation DynamicResource en place de StaticResource dans Dictionary2,

    ou

  2. Merge Dictionnaire 1 Dictionary2, puis il a gagné pas de problèmes.

Dictionary2 ressemblera:

<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> 
+0

merci pour la réponse. Mais comme indiqué dans les commentaires de la question, je ne peux pas. Ceci est juste une démo pour reproduire le problème. En réalité, je crée un add-on pour un programme écrit en WPF et Dictionary1 est l'équivalent de l'habillage actuel pour ce programme. Donc, pour tester, j'ai écrit une application WPF, tout comme la démo dans ce post où je fusionne dans leur dictionnaire de la peau de la même manière que je fusionne dans Dictionary1 dans la démo ... mais il ne fonctionne pas ... Je reçois le même erreur ... d'où ce post ... – user2109254

+0

pouvez-vous expliquer en utilisant une figure ce que vous essayez de faire? – AnjumSKhan

+0

J'essaye de créer un add-on pour un programme qui a déjà un ResourceDictionary de styles. Je veux étendre certains styles dans leur ResourceDictionary avec mes styles. Je ne peux pas ajouter mes styles à leur dictionnaire de ressources car mon complément compile dans une DLL qui est ensuite chargée dans leur programme. Mes styles seront compilés dans ma DLL, je n'ai pas accès à leurs styles, mais comme ils supportent le skinning, je connais leurs styles. – user2109254