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 4] DataGridColumnHeader


Sujet :

Silverlight

  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 : 46
    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 4] DataGridColumnHeader
    Bonjour,

    J'ai un souci concernant la customisation d'un DataGridColumnHeader.

    En effet, si je rajoute un Button à l'intérieur, dans le template de la page de mon application, je peux ajouter l'évènement "Click" sur le bouton.
    Le code behind sera alors dans ma page.

    Le problème est que je suis en train de dev mon propre DataGrid et je voudrais qu'il soit le plus réutilisable possible.
    J'ai alors mis le template de mon DataGridColumnHeader dans mon ResourceDictionary : pas de souci tout s'affiche.

    En revanche, impossible d'ajouter le click... J'ai donc logiquement essayé de récupérer les boutons sur mon composant : et la introuvables !

    Voici le code template de mon DataGridColumnHeader :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    				<ControlTemplate TargetType="sdk:DataGridColumnHeader">
    					<Grid x:Name="Root">
    						<Grid.ColumnDefinitions>
    							<ColumnDefinition/>
    							<ColumnDefinition Width="Auto"/>
    						</Grid.ColumnDefinitions>
    						<VisualStateManager.VisualStateGroups>
    							<VisualStateGroup x:Name="CommonStates">
    								<VisualState x:Name="Normal"/>
    								<VisualState x:Name="MouseOver">
    									<Storyboard>
    										<ColorAnimation Duration="0" To="Black" Storyboard.TargetProperty="(Fill).Color" Storyboard.TargetName="BackgroundRectangle"/>
    										<ColorAnimation Duration="0" To="#7FFFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[3].Color" Storyboard.TargetName="BackgroundGradient"/>
    										<ColorAnimation Duration="0" To="#CCFFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[2].Color" Storyboard.TargetName="BackgroundGradient"/>
    										<ColorAnimation Duration="0" To="#F2FFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[1].Color" Storyboard.TargetName="BackgroundGradient"/>
    									</Storyboard>
    								</VisualState>
    								<VisualState x:Name="Pressed">
    									<Storyboard>
    										<ColorAnimation Duration="0" To="#FF1A1A1A" Storyboard.TargetProperty="(Fill).Color" Storyboard.TargetName="BackgroundRectangle"/>
    										<ColorAnimation Duration="0" To="#D8FFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[0].Color" Storyboard.TargetName="BackgroundGradient"/>
    										<ColorAnimation Duration="0" To="#C6FFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[1].Color" Storyboard.TargetName="BackgroundGradient"/>
    										<ColorAnimation Duration="0" To="#8CFFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[2].Color" Storyboard.TargetName="BackgroundGradient"/>
    										<ColorAnimation Duration="0" To="#3FFFFFFF" Storyboard.TargetProperty="(Fill).(GradientStops)[3].Color" Storyboard.TargetName="BackgroundGradient"/>
    									</Storyboard>
    								</VisualState>
    							</VisualStateGroup>
    							<VisualStateGroup x:Name="SortStates">
    								<VisualState x:Name="Unsorted"/>
    								<VisualState x:Name="SortAscending">
    									<Storyboard>
    										<DoubleAnimation Duration="0" To="1.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SortIcon"/>
    									</Storyboard>
    								</VisualState>
    								<VisualState x:Name="SortDescending">
    									<Storyboard>
    										<DoubleAnimation Duration="0" To="1.0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="SortIcon"/>
    										<DoubleAnimation Duration="0" To="-.9" Storyboard.TargetProperty="(RenderTransform).ScaleY" Storyboard.TargetName="SortIcon"/>
    									</Storyboard>
    								</VisualState>
    							</VisualStateGroup>
    						</VisualStateManager.VisualStateGroups>
    						<Rectangle x:Name="BackgroundRectangle" Grid.ColumnSpan="2" Fill="Black" Stretch="Fill"/>
    						<Rectangle x:Name="BackgroundGradient" Grid.ColumnSpan="2" Stretch="Fill">
    							<Rectangle.Fill>
    								<LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
    									<GradientStop Color="#FCFFFFFF" Offset="0.015"/>
    									<GradientStop Color="#F7FFFFFF" Offset="0.375"/>
    									<GradientStop Color="#E5FFFFFF" Offset="0.6"/>
    									<GradientStop Color="#D1FFFFFF" Offset="1"/>
    								</LinearGradientBrush>
    							</Rectangle.Fill>
    						</Rectangle>
                            <Grid x:Name="HeaderContent"  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
    							<Grid.ColumnDefinitions>
    								<ColumnDefinition/>
    								<ColumnDefinition Width="Auto"/>
    							</Grid.ColumnDefinitions>
                                <ContentPresenter x:Name="HeaderContentPresenter" Content="{TemplateBinding Content}"/>
    							<Path x:Name="SortIcon" Grid.Column="1" Data="F1 M -5.215,6.099L 5.215,6.099L 0,0L -5.215,6.099 Z " Fill="#FF444444" HorizontalAlignment="Left" Margin="4,0,0,0" Opacity="0" RenderTransformOrigin=".5,.5" Stretch="Uniform" VerticalAlignment="Center" Width="8">
    								<Path.RenderTransform>
    									<ScaleTransform ScaleY=".9" ScaleX=".9"/>
    								</Path.RenderTransform>
    							</Path>
     
    							<!-- SILRControls -->
                                <Button  x:Name="FunctionsButton"  Width="17" Height="15"   Grid.Column="1" FontSize="10" Padding="1"  VerticalAlignment="Center"  
                                        HorizontalAlignment="Right"   Margin="18,0,0,0" Cursor="Hand" Style="{StaticResource SILRAdvancedDataGridButtonFunctionsStyle}" Content="Fx" />
     
    						</Grid>
    						<Rectangle x:Name="VerticalSeparator" Grid.Column="1" Fill="{TemplateBinding SeparatorBrush}" Visibility="{TemplateBinding SeparatorVisibility}" VerticalAlignment="Stretch" Width="1"/>
    					</Grid>
    				</ControlTemplate>

    Dans mon composant, côté c# j'ai déjà fait ceci sur la customisation du template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public AdvancedDataGrid()
    		{
                this.DefaultStyleKey = typeof(AdvancedDataGrid);
                this.ContentGroups = this.GetChild("ContentGroups", true) as StackPanel;
    		}
    Pas de souci, j'ai ajouté dans mon template de AdvancedDataGrid un stackpanel qui s'appelle ContentGroups et je le récupère sans problème.

    Mais impossible de faire la même chose avec les boutons sur mes DataGridColumnHeader..

    Si quelqu'un a une idée

    En vous remerciant par avance,

  2. #2
    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 : 46
    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
    Et après des heures de prise de tête, la solution :

    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
     
          public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
     
                DataGridColumnHeadersPresenter presenter = this.GetTemplateChild("ColumnHeadersPresenter") as DataGridColumnHeadersPresenter;
                DataGridColumnHeader colHeader = presenter.Children[0] as DataGridColumnHeader;
     
                if (colHeader != null)
                {
                    colHeader.ApplyTemplate();
                    Button btn = colHeader.GetChild("FunctionsButton", true) as Button;
     
                    btn.Click += new RoutedEventHandler(btn_Click);
                }
            }
     
            void btn_Click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("test");
            }
    L'exemple ici est sur la colonne 0.

    Donc :
    Je vais chercher le DataGridColumnHeadersPresenter
    Dedans, je vais chercher la 1ère (pour tester) DataGridColumnHeader
    Et la la phrase magique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    colHeader.ApplyTemplate();

    Et oui, sans ça, les templates ne sont pas crées et je ne peux pas aller chercher mes boutons qui sont dans le style du resourcedictionary !

    Ensuite ma classe qui manipule le VisualTreeHelper fait le reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Button btn = colHeader.GetChild("FunctionsButton", true) as Button;

    Et voilà.. tout ça pour récupérer un bouton dans un DataGridColumnHeader dont le skin est dans un ResourceDictionary..

    PioufffF..

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

Discussions similaires

  1. Visibility Textbox in DataGridColumnHeader
    Par mickeybond dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 21/06/2012, 09h52
  2. Datagrid -> récupérer un DataGridColumnHeader
    Par stailer dans le forum Silverlight
    Réponses: 1
    Dernier message: 26/03/2011, 19h19
  3. Binder une TextBox à un DataGridColumn.Name dans un DataGridColumnHeader
    Par Krustig dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 18/06/2009, 09h31
  4. Drag & Drop DatagridColumnHeader
    Par ludogoal dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 09/06/2009, 08h42

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