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

Windows Presentation Foundation Discussion :

[WPF] ControlTemplate - DataTemplate - Style ?


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut [WPF] ControlTemplate - DataTemplate - Style ?
    Hello!

    je cherche a faire la chose suivante :

    1 style comme celui-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <ListView ....>
    </ListView>
    et 1 autre comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <Viewbox>
    <ListView ....>
    </ListView
    </Viewbox>
    Les listviews seraient les mêmes (et utiliseraient également le même style pour les listviewitems!).

    Je peux faire ca comment au plus simple??

    Merci pour votre aide!
    ++

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Dans les ressources, tu déclares un style et après, tu fais:

    <ListView Style={StaticResource TonStyle}"


    Pour les éléments de la listview, c'est ItemContainerStyle

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    re! merci pour ta réponse!

    en fait je pense que je me suis mal expliqué! J'ai déjà fais ce que tu me dis, le problème étant de pouvoir switcher entre

    <Viewbox>
    <ListView... />
    </Viewbox>

    ET

    <ListView.../>

    Car le viewbox ne fait pas partie du style de la listview! (je veux vraiment que le viewbox "contienne" la listview dans le 1er style et dans le second style, je ne veux pas du tout de viewbox)

    Je peux peut-etre passer par un <ContentControl> et lui donner 2 styles... par exemple :

    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
    <Window.Resource>
    <Style x:Key="MyStyle1" TargetType="{x:Type ContentControl}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type ContentControl}">
                                           <Viewbox>
                                                <ListView x:Name="lstView" ..../>
                                           </Viewbox>
    				</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    		</Style>
    
    <Style x:Key="MyStyle2" TargetType="{x:Type ContentControl}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type ContentControl}">
                                               <ListView x:Name="lstView" ..../>
    				</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    		</Style>
    </Window.Resource>
    
    <ContentControl Style="MyStyle1"/>
    Mais après, dans mon code-behind, je fais comment pour accéder à ma ListView (lstView). Je vais perdre l'accès this.lstView.... non?

    Merci pour ton aide!


    edit: en fait la listview devrait alors faire partie d'un 3e style! car son x:Name doit rester le meme!

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Pour pouvoir accéder à ta ListView, tu va devoir parcourir le Template: http://www.developpez.net/forums/sho...d.php?t=324028

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Thomas Lebrun
    Pour pouvoir accéder à ta ListView, tu va devoir parcourir le Template: http://www.developpez.net/forums/sho...d.php?t=324028
    thx! mais j'y arrive tjs pas .... je dois remonter 2 niveaux

    Mon code de test c'est ca :

    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
     
    	<Window.Resources>	
    		<Style x:Key="MyLstView" TargetType="{x:Type ContentControl}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type ContentControl}">
    						<Button Content="Salut!" Name="btn1" Click="btn1_Click"/>
    					</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    		</Style>
     
     
    		<Style x:Key="ContentControlStyle1" TargetType="{x:Type ContentControl}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type ContentControl}">
    						<Viewbox>
    							<ContentControl Style="{DynamicResource MyLstView}"/>
    						</Viewbox>
    					</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    		</Style>
     
    		<Style x:Key="ContentControlStyle2" TargetType="{x:Type ContentControl}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type ContentControl}">
    						<ContentControl Style="{DynamicResource MyLstView}"/>
    					</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    		</Style>
    	</Window.Resources>
     
     
    	<Grid x:Name="LayoutRoot">
    		<Grid.RowDefinitions>
    			<RowDefinition Height="0.2*"/>
    			<RowDefinition Height="0.8*"/>
    		</Grid.RowDefinitions>
    		<Button Grid.Row="0" Click="btnSwitch_Click">Display Style 2</Button>
     
    		<ContentControl x:Name="myContent"
    						HorizontalAlignment="Stretch" Margin="0,0,0,0"
    						Style="{DynamicResource ContentControlStyle1}"
    						VerticalAlignment="Stretch" Content="" Grid.Row="1"/>
    	</Grid>
    Donc en fait dans le code-behind j'ai accès à "myContent" qui a comme style "ContentControlStyle1". Celui-ci contient le ContentControl avec le style "MyLstView" et c'est ce style qui contient le bouton auquel je veux avoir accès

    Si t'as une solution, je suis preneur

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Ben, avec le lien que je t'ai donné, tu devrais y arriver....

    Quel code behing utilises-tu ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    ben d'abord je recherche le style qui contient le bouton... donc :

    Style s = (Style)this.FindResource("MyLstView");

    Ensuite, dans ce style je dois recherche le nom du bouton...et là je bloque! Je pensais à qqch du style :

    Button b = (Button)s.FindName("btn1"); // Mais "FindName" n'existe pas...

    donc j'ai essayé avec

    s.Resources.FindName("btn1"); // et ca marche pas non plus...pas étonnant d'ailleurs

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    yop yop

    Juste pour te féliciter pour ton article sur la séparation de la logique métier du code de présentation!

    D'ailleurs j'applique pas vraiment la règle sur le code que je propose . Mais vu que je ne trouve pas d'autres solutions...

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par PlaTyPuSs
    yop yop

    Juste pour te féliciter pour ton article sur la séparation de la logique métier du code de présentation!

    Merci


    Pour ton pb, fais le findname sur le Template, pas le style

    this.myContent.Template.FindName(....)

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Thomas Lebrun

    this.myContent.Template.FindName(....)
    bah, ca marche pas

    Button b = (Button)this.myContent.Template.FindName("btn1", this.myContent);

    le problème, c'est que le schéma est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    "myContent"
        -->  qui peut prendre le style "ContentControlStyle" 1 ou 2
                        --> qui prennent les 2 le style MyLstView
    et c'est dans le style MyLstView que je veux accéder à "btn1"....

  11. #11
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Curieux pourtant, cela devrait marcher


    Et en utilisant VisualTreeHelper.GetChild ?

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Thomas Lebrun
    Curieux pourtant, cela devrait marcher
    mais comment il fait pour remonter en utilisant simplement myContent.Template.FindName ?

    Ca me parait peu probable qu'il y arrive non? vu que ma structure en très court, c'est ca :

    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
     
    	<Window.Resources>	
    		<Style x:Key="MyLstView" TargetType="{x:Type ContentControl}">
    		     <Button Content="Salut!" Name="btn1" Click="btn1_Click"/>
    		</Style>
     
     
    		<Style x:Key="ContentControlStyle1" TargetType="{x:Type ContentControl}">
    			<Viewbox>
    				<ContentControl Style="{DynamicResource MyLstView}"/>
    			</Viewbox>
    		</Style>
     
    		<Style x:Key="ContentControlStyle2" TargetType="{x:Type ContentControl}">
    			<ContentControl Style="{DynamicResource MyLstView}"/>
    		</Style>
    	</Window.Resources>
     
     
    	<Grid x:Name="LayoutRoot">
    		<ContentControl x:Name="myContent"
    		                       Style="{DynamicResource ContentControlStyle1}"/>
    	</Grid>
    J'ai encore essayé qqs trucs, mais sans succès... es-tu sûr que c'est faisable?

    Sinon je devrai simplement déclarer 2 styles qui se ressemble beaucoup... ca fait de la répétition, mais au moins ca marche!

    Bonne soirée!

  13. #13
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Thomas Lebrun
    Et en utilisant VisualTreeHelper.GetChild ?
    ca j'ai pas essayé.... mais ca devient pas un peu scabreux comme procédé non??

  14. #14
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Ok donc si je comprend bien, ce que tu veux, c'est avoir accès au bouton qui est à l'intérieur du style ?

    Dans ce cas, utilise ce code:
    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
     
    <Window.Resources>	
    		<Style x:Key="MyLstView" TargetType="{x:Type ContentControl}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type ContentControl}">
    						<Button Content="Salut!" Name="btn1" />
    					</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    		</Style>
     
     
    		<Style x:Key="ContentControlStyle1" TargetType="{x:Type ContentControl}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type ContentControl}">
    						<Viewbox>
    							<ContentControl Style="{DynamicResource MyLstView}" x:Name="contentCtrl"/>
    						</Viewbox>
    					</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    		</Style>
     
    		<Style x:Key="ContentControlStyle2" TargetType="{x:Type ContentControl}">
    			<Setter Property="Template">
    				<Setter.Value>
    					<ControlTemplate TargetType="{x:Type ContentControl}">
    						<ContentControl Style="{DynamicResource MyLstView}" x:Name="contentCtrl"/>
    					</ControlTemplate>
    				</Setter.Value>
    			</Setter>
    		</Style>
    	</Window.Resources>
     
     
    	<Grid x:Name="LayoutRoot">
    		<Grid.RowDefinitions>
    			<RowDefinition Height="0.2*"/>
    			<RowDefinition Height="0.8*"/>
    		</Grid.RowDefinitions>
    		<Button Grid.Row="0" Click="btnSwitch_Click">Display Style 2</Button>
     
    		<ContentControl x:Name="myContent"
    						HorizontalAlignment="Stretch" Margin="0,0,0,0"
    						Style="{DynamicResource ContentControlStyle1}"
    						VerticalAlignment="Stretch" Content="" Grid.Row="1"/>
    	</Grid>
    C'est le même que le tiens sauf que j'ai rajouté: <ContentControl Style="{DynamicResource MyLstView}" x:Name="contentCtrl"/>


    Ensuite, tu as cette méthode qui fait tout le reste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private void btnSwitch_Click(object sender, RoutedEventArgs e)
            {
                ControlTemplate ct = this.myContent.Template;
                ContentControl c = (ContentControl)ct.FindName("contentCtrl", this.myContent);
     
                Button btn = (Button)c.Template.FindName("btn1", c);
                btn.Content = "Ca marche!";
            }
    Tu commences par récupérer le Template associé à ton ContentControl. Une fois que tu l'as, tu récupères le ContentControl qui est à l'intérieur. Une fois que tu as ce ContentControl, tu récupères son template (définis par le style) et le tour est joué


    Testé et approuvé


    Tiens moi au courant


    A+

  15. #15
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    wahouuuuuu ca marche nickel!!!!

    je savais pas qu'on pouvais donner 2x le même x:Name! Apparemment tant que c'est pas dans le même style, c'est bon... c cool ca!!

    Merci pour ton aide en tout cas!!

  16. #16
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tu peux en effet donner 2 fois le même x:Name tant que ce n'est pas dans le même scope. Mais bon, ce n'est pas conseiller alors comme c'est toi qui fait le FindName, tu peux leur mettre des x:Name différents et appeller le bon lors de ton FindName



    Ravi de t'avoir aidé


    A+

  17. #17
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    re... un autre problème est apparu mtn... je sais pas si t'aurais une idée de c qui peut provoquer ce comportement

    En fait, je peux switcher entre les styles (ContentControlStyle1 et ContentControlStyle2), mais quand je le fais, je perds les regroupement effectué sur ma ListView (enfin plutot sur ma CollectionViewSource en fait!)

    <Style x:Key="MyLstView"> --> contient une ListView qui est bindé à une CollectionViewSource sur laquelle j'applique des regroupement/filtres.

    Pourtant le regroupement dans la CollectionViewSource ne devrait pas être affecté par un changement de style non??

    Merci encore pour ton aide!

  18. #18
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Apparemment le problème doit être lié au fait que si je veux intercepter correctement le clic sur un des bouton de ma listviewitem, je dois à chaque fois déclarer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ControlTemplate ct = this.myContent.Template;
    ContentControl cc = (ContentControl)ct.FindName("contentCtrl", this.myContent);
    ListView lst = (ListView)cc.Template.FindName("lstViewTask", cc);
    Pour ensuite pouvoir faire un
    J'ai essayé de les mettre comme variable de classe en les instanciant dans le constructeur, mais lors du clic sur le bouton, il me fait une erreur NULL....

    Si t'as une explication sur ca, peut-être que je comprendrai le fait que le regroupement ne fonctionne plus avec après un changement de style.

    thx!

  19. #19
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Quand tu changes de style, tu réinstancies à chaque fois les éléments du style donc cela ne me choque pas que cela ne marche pas.

    Par contre, en mettant la CollectionViewSource en membre de la classe et en la réappliquant à chaque fois, cela devrait etre ok....

  20. #20
    Futur Membre du Club
    Inscrit en
    Juin 2005
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Thomas Lebrun
    Quand tu changes de style, tu réinstancies à chaque fois les éléments du style donc cela ne me choque pas que cela ne marche pas.

    Par contre, en mettant la CollectionViewSource en membre de la classe et en la réappliquant à chaque fois, cela devrait etre ok....
    euhhh j'ai essayé qqs trucs sans succès...

    dans mon App.xaml.cs, j'ai toutes mes ObservableCollections d'objets et dans un autre fichier (Header.xaml.cs), j'ai ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CollectionViewSource listingDataView;
    listingDataView = (CollectionViewSource)((Window1.getInstance()).Resources["cvs"]);
    "cvs" (CollectionViewSource) que je récupère du fichier xaml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <CollectionViewSource
                  x:Key="cvs" x:Name="cvs"
                  Source="{Binding Source={x:Static Application.Current}, Path=TasksList}" />
     
    <ListView
    	x:Name="lstViewTask"
    	ItemsSource="{Binding Source={StaticResource cvs}}"/>
    Mais je vois vraiment pas ce que je dois réaffecter... je pensais que c'était le "ItemsSource" de la listview, mais je trouve pas comment le réaffecter!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [WPF]ControlTemplate avec ComboBox
    Par Babas007 dans le forum Windows Presentation Foundation
    Réponses: 31
    Dernier message: 02/12/2010, 14h31
  2. [WPF] listviewitem - définition style
    Par Manu355 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 29/03/2010, 17h45
  3. WPF : Problème de style
    Par Philenain dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 08/12/2009, 12h52
  4. [WPF][C#] DataTemplate qui marche en WPF mais pas en C#
    Par azerty53 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 07/03/2008, 11h35
  5. [WPF] Problème de style
    Par JuTs dans le forum Framework .NET
    Réponses: 11
    Dernier message: 25/11/2007, 00h26

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