WPF : Trouver le parent d'un controle déclaré dans un template
1 réponse
Luis
Contexte :
Windows XP
Framework 3.5 SP1
Bonjour,
Dans le code XAML ci-dessous, j'ai créé un ListView avec 2 colonnes.
Les entêtes de colonnes ont un aspect dépendant d'un DataTemplate nommé
HeaderTemplateButton.
Le DataTemplate correspond au titre de la colonne à gauche et un bouton
a droite.
Je veux gérer l'évenement click des entêtes de colonnes en interceptant
soit le click sur le bouton, soit le click sur le Header.
Le code de l'évenemement correspond à ceci :
**********
void GridViewColumnHeaderClickedHandler(object sender,
RoutedEventArgs e)
{
GridViewColumnHeader headerClicked = e.OriginalSource as
GridViewColumnHeader;
Button buttonClicked = e.OriginalSource as Button;
if (headerClicked != null)
{
label1.Content = "Colonne cliquée !";
}
if (buttonClicked != null)
{
label1.Content = "Boutton cliqué";
}
}
**********
Quand je clique sur l'entête, je sait lequel est cliqué.
Par contre, j'aimerais, quand je clique sur le bouton, trouver quel
entête est concerné.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Luis
Luis vient de nous annoncer :
Contexte : Windows XP Framework 3.5 SP1
Bonjour,
Dans le code XAML ci-dessous, j'ai créé un ListView avec 2 colonnes. Les entêtes de colonnes ont un aspect dépendant d'un DataTemplate nommé HeaderTemplateButton. Le DataTemplate correspond au titre de la colonne à gauche et un bouton a droite.
Je veux gérer l'évenement click des entêtes de colonnes en interceptant soit le click sur le bouton, soit le click sur le Header. Le code de l'évenemement correspond à ceci :
********** void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e) { GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader; Button buttonClicked = e.OriginalSource as Button; if (headerClicked != null) { label1.Content = "Colonne cliquée !"; } if (buttonClicked != null) { label1.Content = "Boutton cliqué"; }
} **********
Quand je clique sur l'entête, je sait lequel est cliqué. Par contre, j'aimerais, quand je clique sur le bouton, trouver quel entête est concerné.
Voici un retour d'expèrience avec l'aide de Thomas LEBRUN sur le forum Developpez.net
Voici la réponse à ma question : Utiliser la classe VisualTreeHelper
Le code de l'évènement devient donc :
void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e) { GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader; Button buttonClicked = e.OriginalSource as Button; if (headerClicked != null) { label1.Content = "Colonne cliquée !"; } if (buttonClicked != null) { DependencyObject dep=buttonClicked as DependencyObject; while (!(dep is GridViewColumnHeader)) dep = VisualTreeHelper.GetParent(dep); GridViewColumnHeader AncestorHeader = dep as GridViewColumnHeader; label1.Content = "Bouton cliqué . Header ="+AncestorHeader.ToString(); } }
Cordialement. Luis.
Luis vient de nous annoncer :
Contexte :
Windows XP
Framework 3.5 SP1
Bonjour,
Dans le code XAML ci-dessous, j'ai créé un ListView avec 2 colonnes.
Les entêtes de colonnes ont un aspect dépendant d'un DataTemplate nommé
HeaderTemplateButton.
Le DataTemplate correspond au titre de la colonne à gauche et un bouton a
droite.
Je veux gérer l'évenement click des entêtes de colonnes en interceptant soit
le click sur le bouton, soit le click sur le Header.
Le code de l'évenemement correspond à ceci :
**********
void GridViewColumnHeaderClickedHandler(object sender,
RoutedEventArgs e)
{
GridViewColumnHeader headerClicked = e.OriginalSource as
GridViewColumnHeader;
Button buttonClicked = e.OriginalSource as Button;
if (headerClicked != null)
{
label1.Content = "Colonne cliquée !";
}
if (buttonClicked != null)
{
label1.Content = "Boutton cliqué";
}
}
**********
Quand je clique sur l'entête, je sait lequel est cliqué.
Par contre, j'aimerais, quand je clique sur le bouton, trouver quel entête
est concerné.
Dans le code XAML ci-dessous, j'ai créé un ListView avec 2 colonnes. Les entêtes de colonnes ont un aspect dépendant d'un DataTemplate nommé HeaderTemplateButton. Le DataTemplate correspond au titre de la colonne à gauche et un bouton a droite.
Je veux gérer l'évenement click des entêtes de colonnes en interceptant soit le click sur le bouton, soit le click sur le Header. Le code de l'évenemement correspond à ceci :
********** void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e) { GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader; Button buttonClicked = e.OriginalSource as Button; if (headerClicked != null) { label1.Content = "Colonne cliquée !"; } if (buttonClicked != null) { label1.Content = "Boutton cliqué"; }
} **********
Quand je clique sur l'entête, je sait lequel est cliqué. Par contre, j'aimerais, quand je clique sur le bouton, trouver quel entête est concerné.