2010-03-21 4 views
8

J'utilise Visual Studio 2010 RC1.Impossible d'accéder à la ressource définie dans app.xaml

Je définir une ressource « Brush2 » dans app.xaml_:

<Application x:Class="VideoThumbnails.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 

     <RadialGradientBrush x:Key="Brush2" RadiusX="1" RadiusY="1" GradientOrigin="0.3,0.3"> 
      <GradientStop Color="White" Offset="0"/> 
      <GradientStop Color="#ffc0c0" Offset="1"/> 
     </RadialGradientBrush> 

    </Application.Resources> 
</Application> 

Dans mon mainWindow je suis en train d'utiliser cette ressource:

... 
<Border Margin="4,2" BorderBrush="Black" BorderThickness="2" CornerRadius="4" 
     ToolTip="{Binding Path=FullPath}" HorizontalAlignment="Stretch" 
     Background="{StaticResource Brush2}"> 
... 

Peu importe ce que je fais soulève toujours exception à l'exécution (ressource non trouvée). J'ai changé l'action de construction sans succès. Comment utiliser les ressources définies dans app.xaml?

Comment utiliser les ressources définies dans app.xaml?

Répondre

4

Rien de ce que vous avez fait est incorrect. Vous avez soit 1) foiré la construction du projet en quelque sorte tout en faisant des choses au hasard pour essayer de le faire fonctionner ou 2) quelque chose d'autre se passe ici et nous ne le saurons jamais sans les détails de l'exception.

Je vous suggèrerais fortement de le reprocher dans un tout nouveau projet WPF. Effectuez les étapes suivantes (et SEULEMENT les étapes suivantes):

Créez un nouveau projet WPF, ajoutez le même pinceau à app.xaml, puis ouvrez Window1 et liez l'arrière-plan de la fenêtre à la ressource. Lancez l'application

Cela devrait fonctionner comme prévu. Sinon, revenez avec les détails de l'exception. Si c'est le cas, comparez ce nouveau projet avec votre projet actuel pour voir ce que vous faites différemment.

+1

Grâce à votre suggestion, cela fonctionne enfin. J'ai explicitement défini l'objet de démarrage dans les propriétés du projet à une certaine classe que j'ai définie moi-même. J'ai changé cela pour "(non défini)" et cela fonctionne. C'est étrange ... – DerKlaus

+0

Cela a du sens. Non défini conduirait à interpréter App.xaml pour savoir quoi faire au démarrage. Si vous le placez dans votre propre classe, cela ne se produira pas à moins que vous ne l'ayez fait explicitement. –

+1

@DerKlaus - Merci pour votre commentaire! Je définirais l'action de construction de App.xaml sur Page afin que je puisse créer mon propre point d'entrée. (ceci m'a bien sûr fait perdre mon dictionnaire de ressources partagé des styles de chargement au moment du design). Je ne savais pas que je pouvais définir l'objet de démarrage dans les propriétés du projet jusqu'à la lecture de votre commentaire. Cela m'a permis de ramener l'action de construction de App.xaml à la définition d'application! Merci encore! – Scott

16

Si vous avez défini l'objet de démarrage à une classe personnalisée, vous devez créer la classe d'application personnalisée et aussi appeler sa méthode InitializeComponent, comme ceci:

App app = new App(); 
app.InitializeComponent(); 

Mise à jour: Comme @ qqww2 suggéré le InitializeComponent appel peut être déplacé à l'intérieur du constructeur de la classe App.

+1

Ou, mieux encore, ajoutez la méthode 'InitializeComponent();' au constructeur de la classe 'App'. Pas besoin de se souvenir de l'appel de fonction après la création de l'objet. –

+0

Vous avez raison, c'est comme ça que j'ai commencé à l'utiliser à un moment donné. Mais j'ai oublié de mettre à jour cette réponse. Merci de le signaler! – ceco

+0

C'est exactement ce que j'avais besoin de trouver. – sidbushes

3

Je sais qu'il existe une réponse déjà acceptée, mais j'ai pensé que j'ajouterais aussi ma solution. J'ai eu le code qui fonctionnait, mais un changement de configuration a cassé les références de ressource dans le concepteur. En exécutant le code, cela a bien fonctionné. Après quelques recherches initiales, j'ai déterminé que la propriété BuildAction pour App.xaml doit être définie sur ApplicationDefinition. Mon était réglé sur Page. Cependant, cela provoque des problèmes avec plusieurs points d'entrée. Main() était déjà défini dans App.xaml.cs. L'erreur de compilation indiquait un autre point d'entrée dans App.g.cs (qui est un fichier autogénéré). J'ai fini par utiliser l'approche # 3 décrite à http://www.infosysblogs.com/microsoft/2008/09/how_to_write_custom_main_metho.html. L'idée de base est que vous créez une nouvelle classe qui est seulement responsable du démarrage. Dans mon cas, je l'ai nommé Startup.cs. Il devrait avoir un code semblable à ceci:

using System.Threading; 

namespace MyNamespace 
{ 
    public class Startup 
    { 
     [System.STAThreadAttribute()] 
     private static void Main() 
     { 
      var app = new App(); 
      app.InitializeComponent(); 
      app.Run(); 
     } 
    } 
} 

Puis, dans les paramètres du projet, changer l'application -> Objet de démarrage afin que votre nouvelle classe est sélectionnée.

3

J'ai eu un problème similaire et l'ai résolu, donc j'ai pensé que je pourrais aussi poster ma solution. J'ai continué à obtenir l'erreur Resource not found uniquement au moment de l'exécution comme décrit ci-dessus. Dans mon application Windows 8.1 C#, j'utilisais un style que j'avais défini, et il se montrait très bien dans Blend et la vue du concepteur, mais ne fonctionnait pas à l'exécution. J'essayais d'utiliser ce style dans un SettingsFlyout que j'avais créé suivant these instructions.Après avoir obtenu cela pour travailler, j'ai mis en place un champ dans App.xaml pour garder mes flyouts (Préférences et ColorSettings) donc je ne ferais pas un nouveau à chaque fois.

public static Preferences preferences; 
public static ColorSettings colorsettings; 

public App() 
{ 
    this.InitializeComponent(); 
    this.Suspending += OnSuspending; 
    preferences = new Preferences(); 
    colorsettings = new ColorSettings(); 
} 

Après farfouillé et googler pendant environ une heure, je me suis dit que je créais les flyouts trop tôt, et quand ils ont été créés ils ne pouvaient pas accéder aux ressources de l'application. J'ai donc déplacé leur création à App.OnLaunched() et cela a résolu le problème.

Je ne sais pas si c'est la meilleure façon de faire les choses, mais cela a fonctionné. Alors, essayez d'identifier où vous essayez d'accéder aux ressources que vous voulez, et si vous essayez peut-être trop tôt. Désolé pour le flou et peut-être incorrect, je suis vraiment nouveau à WPF.

3

Je peux convenir que les ressources se gâter facilement si vous avez quelque chose dans le constructeur de l'App. Déplacer l'initialisation de vos propres objets globaux dans la méthode OnStartup:

protected override void OnStartup(StartupEventArgs e) 
{ 
} 
Questions connexes