IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

[SL 3] Accès à un ResourceDictionary depuis C#


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut [SL 3] Accès à un ResourceDictionary depuis C#
    Bonjour,

    Je débute donc sur Silverlight 3 et Expression Blend 3.
    Mon but est de construire des templates (ou skins) dans Blend 3 et de les incorporer facilement dans Visual Studio.

    Jusque la pas de problème concernant les styles. Par contre mes ResourceDictionary comportent des animations (Storyboard) que j'aimerais déclencher quand je le désire.

    Après des heures de recherches impossible d'arriver à mon but par ce que propose C# et j'ai donc du me développer une petite méthode FindStoryboard qui parse avec Linq to XML mon ResourceDictionary... Bref, en gros voilà ce que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    XamlFinder find = new XamlFinder("ResourceDictionary1.xaml");
     
    Storyboard stb = find.Storyboard("Storyboard1");
    Storyboard.SetTarget(stb, this.calendar1);
     
    stb.Begin();
    Ca fonctionne mais quelqu'un pourrait-il me dire s'il n'existe pas une méthode magique pour trouver mon storyboard ? que ce soit en silverlight 3 ou 4 (je vais bientôt l'installer).

    J'ai vaguement trouvé ce type de code mais qui ne fonctionne absolument pas chez moi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Storyboard sb = (Storyboard) this.Resources["Storyboard1"];
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Storyboard sb = (Storyboard) Application.Current.Resources["Storyboard1"];

    Merci pour vos réponses,

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Si tes ResourcesDictionary sont dans ton projet comme ça sans les utiliser alors App.Current.Resources["xx"] ne retournera rien.

    Pour ça il faut que tu références tes dictionnaires dans ton App.xaml.

    Dans la balise Resources tu rajoutes un ResourceDictionary puis dans l'attribut MergedDictionnaries tu ajoutes tes xaml un par un (ils peuvent même être dans une assembly différentes).

    Un truc du genre

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/TonAssembly;component/Resources/TaRessource.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

    Après ça tu pourras les récupérer avec
    App.Current.Resources["xxx"] as Storyboard;

    Avec xxx la valeur que tu as mise dans x:Key

  3. #3
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    J'ai bien mon App.xaml comme tu le décris mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     <ResourceDictionary >
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary  Source="ADictionnary.xaml" />
                    <ResourceDictionary Source="ResourceDictionary1.xaml" />
                </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    App.Current.Resources contient bien mes resources effectivement mais ceci me retourne un null :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    App.Current.Resources["Storyboard1"] as Storyboard;

    Code de mon ResourceDictionary1.xaml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <ResourceDictionary
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" xmlns:System_Windows_Controls_Primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls">
        <!-- Les entrées du dictionnaire de ressources sont définies ici. -->
        <Style x:Key="CalendarStyle2" TargetType="controls:Calendar">
            <Setter Property="IsTabStop" Value="False"/>
            <Setter Property="Background">
                <Setter.Value>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FFD3DEE8" Offset="0"/>
                        <GradientStop Color="#FFD3DEE8" Offset="0.16"/>
                        <GradientStop Color="#FFFCFCFD" Offset="0.16"/>
                        <GradientStop Color="#FFFFFFFF" Offset="1"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="BorderBrush">
                <Setter.Value>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FFA3AEB9" Offset="0"/>
                        <GradientStop Color="#FF8399A9" Offset="0.375"/>
                        <GradientStop Color="#FF718597" Offset="0.375"/>
                        <GradientStop Color="#FF617584" Offset="1"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter x:Uid="Field1" Property="Template">
                <Setter.Value>
                    <ControlTemplate x:Uid="MyTemplate" TargetType="controls:Calendar">
                        <StackPanel x:Uid="Root" HorizontalAlignment="Center">
                            <StackPanel.Resources>
                                
                                <Storyboard  x:Key="Storyboard1">
                                    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="CalendarItem" Storyboard.TargetProperty="(UIElement.Opacity)">
                                        <EasingDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
                                        <EasingDoubleKeyFrame KeyTime="00:00:02" Value="0"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
    
                        
                            </StackPanel.Resources>
                            <System_Windows_Controls_Primitives:CalendarItem x:Name="CalendarItem" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"/>
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>
    Peut-être que ce ResourceDictionary ne doit contenir que des storyboard et non des styles etc.. ?


    EDIT : Petite précision, mes fichiers ResourceDictionary1.xaml et ADictionnary.xaml sont en mode "CONTENU" dans les propriétés et non en mode "RESOURCE" .
    Si je les mets en "RESOURCE" ou "RESOURCE INCORPOREE" le projet se lance masi ça plante sur le InitializeComponent() du UserControl

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Mets les en mode Resource et utilise la syntaxe que j'ai donné dans mon message.

    Source="/TonAssembly;component/Resources/TaRessource.xaml"

    Laisse bien les / les ; et le component/

  5. #5
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       <ResourceDictionary >
                <ResourceDictionary.MergedDictionaries>
     
                    <ResourceDictionary  Source="/DemoApp;component/Resources/ADictionnary.xaml" />
                    <ResourceDictionary Source="/DemoApp;component/Resources/ResourceDictionary1.xaml" />
                </ResourceDictionary.MergedDictionaries>
     
            </ResourceDictionary>

    L'application se lance.... Les styles sont bien appliqués mais ceci me renvoie encore un null:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Storyboard stb = App.Current.Resources["Storyboard1"] as Storyboard;

    Nous sommes bien d'accord que j'ai uniquement un fichier .xaml dans mon répertoire resources ? je n'ai pas de DLL à ajouter ?

    Je demande ça parce que j'ai installé Silverlight 4 et j'ai commencé à utiliser le système de theming : il y a bien le fichier de définition XAML à rajouter dans le projet pour activer le thème de son choix, mais il y a aussi la DLL du même nom à référencer. Moi j'ai juste mon fichier de définition .xaml. On est ok la dessus ?

    J'en profite pour te remercier de te pencher sur mon souci

  6. #6
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Ok c'est parce que ton Storyboard se trouve dans un Style.
    Déplace le à l'extérieur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    <ResourceDictionary
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" xmlns:System_Windows_Controls_Primitives="clr-namespace:System.Windows.Controls.Primitives;assembly=System.Windows.Controls">
        <!-- Les entrées du dictionnaire de ressources sont définies ici. -->
                                <Storyboard  x:Key="Storyboard1">
                                    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="CalendarItem" Storyboard.TargetProperty="(UIElement.Opacity)">
                                        <EasingDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
                                        <EasingDoubleKeyFrame KeyTime="00:00:02" Value="0"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
        <Style x:Key="CalendarStyle2" TargetType="controls:Calendar">
            <Setter Property="IsTabStop" Value="False"/>
            <Setter Property="Background">
                <Setter.Value>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FFD3DEE8" Offset="0"/>
                        <GradientStop Color="#FFD3DEE8" Offset="0.16"/>
                        <GradientStop Color="#FFFCFCFD" Offset="0.16"/>
                        <GradientStop Color="#FFFFFFFF" Offset="1"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="BorderBrush">
                <Setter.Value>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="#FFA3AEB9" Offset="0"/>
                        <GradientStop Color="#FF8399A9" Offset="0.375"/>
                        <GradientStop Color="#FF718597" Offset="0.375"/>
                        <GradientStop Color="#FF617584" Offset="1"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
            <Setter x:Uid="Field1" Property="Template">
                <Setter.Value>
                    <ControlTemplate x:Uid="MyTemplate" TargetType="controls:Calendar">
                        <StackPanel x:Uid="Root" HorizontalAlignment="Center">
                            <System_Windows_Controls_Primitives:CalendarItem x:Name="CalendarItem" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"/>
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ EJB ] [ TOMCAT ] accès aux EJB depuis Tomcat
    Par Houbbba dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 30/07/2008, 11h42
  2. [C#] acces à un control depuis code behind
    Par Louis-Guillaume Morand dans le forum ASP.NET
    Réponses: 2
    Dernier message: 02/04/2006, 08h42
  3. accés a oracle depuis une autre machine
    Par tounsi dans le forum Connexions aux bases de données
    Réponses: 10
    Dernier message: 16/01/2006, 17h06
  4. acces base postgres depuis eclipse
    Par mealtone dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 03/06/2005, 10h16
  5. Accès serveur WEB depuis l'internet
    Par Ultra-FX dans le forum Réseau
    Réponses: 2
    Dernier message: 26/05/2005, 17h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo