3

J'ai la situation où un SolidColorBrush (défini dans App.xaml) ne peut pas être résolu pendant l'exécution, lorsque j'utilise le pinceau dans un style comme StaticResource.StaticResource non trouvé

Pendant la conception (à l'aide de Visual Studio 2010), le pinceau est trouvé, car lorsque je change la couleur du pinceau, le UIElement avec les styles est mis à jour avec la nouvelle couleur.

Lors de l'exécution, une exception XAMLParseException est déclenchée, indiquant que la ressource "color" est introuvable.

Est-ce un comportement normal? Je pensais que la résolution de StaticResource, commence à partir des UIElements jusqu'aux ressources de l'application et que les ressources de l'application sont un bon endroit pour définir les valeurs par défaut (couleurs, polices, etc.) pour les UIElements de l'application.

App.xaml

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Class="SilverlightApplication1.App" 
     > 
<Application.Resources> 
    <ResourceDictionary> 
     <SolidColorBrush Color="Green" x:Key="color"/> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Styles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Styles.xaml

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

<Style TargetType="Border"> 
    <Setter Property="BorderBrush" Value="{StaticResource color}" /> 
    <Setter Property="BorderThickness" Value="1" /> 
</Style> 

Main.xaml

<UserControl x:Class="SilverlightApplication1.MainPage" 
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" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400"> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <Border Height="100" HorizontalAlignment="Left" Margin="130,146,0,0" Name="border1" VerticalAlignment="Top" Width="200" /> 
</Grid> 

+0

Avez-vous essayé d'ajouter le SolidColorBrush dans le Styles.xaml? –

+0

@Ardman: Cela fonctionne. Mais ce n'est pas ce que je veux ici – Jehof

Répondre

2

Je refactorisé les définitions des ressources et mettre le SolidColorBrush "Couleur" dans un ResourceDictionary "General.xaml"

je fusionné le ResourceDictionary "General.xaml" dans le ResourceDictionary « Styles .xaml ". Maintenant, cela fonctionne sans aucun problème. Je pense que c'est la voie à suivre avec les ressources.

General.xaml

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

    <SolidColorBrush Color="Green" x:Key="color"/> 
</ResourceDictionary> 

Styles.xaml

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

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

    <Style TargetType="Border"> 
    <Setter Property="BorderBrush" Value="{StaticResource color}" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    </Style> 
</ResourceDictionary> 
2

J'ai eu récemment certains problèmes comme ceux-ci contournent le succès en plaçant tous les styles dans les dictionnaires de ressources XAML et de les fusionner à runtime. La fusion de ces mêmes dictionnaires dans XAML n'a pas résolu le problème.

App.xaml.cs

public App() 
{ 
    if (DesignerProperties.IsInDesignTool == false) 
    { 
     this.Startup += this.Application_Startup; 
    } 
} 

private void Application_Startup(object sender, StartupEventArgs e) 
{   
    System.Uri uri = new System.Uri("/MRW.UI;component/Resources/Library.xaml", UriKind.RelativeOrAbsolute); 

    System.Windows.ResourceDictionary dictionary = new System.Windows.ResourceDictionary(); 
dictionary.Source = uri; 
    App.Current.Resources.MergedDictionaries.Add(dictionary); 
} 
+0

Merci pour votre réponse. C'est aussi la façon dont je choisis d'ajouter de nouvelles ResourceDictionaries à l'ApplicationResources, pour les modules que je charge pendant l'exécution – Jehof

+0

Une autre chose que j'ai récemment découverte ... – NigelTufnel

+0

a pris trop de temps pour éditer le commentaire ci-dessus ... Une autre chose que l'on de mes collègues récemment découvert ... vous pouvez fusionner les mêmes dictionnaires dans le code et dans XAML sans erreur. Cela vous permettra de travailler dans le concepteur Visual Studio ou Blend et de résoudre le problème ci-dessus. – NigelTufnel