Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

WPF : Trouver le parent d'un controle déclaré dans un template

1 réponse
Avatar
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é.

Pourriez vous me dire comment on fait ?

Merci d'avance.
Luis.


Code XAML :
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<DataTemplate x:Key="HeaderTemplateButton">
<DockPanel>
<TextBlock HorizontalAlignment="Center" Text="{Binding
}"/>
<TextBlock HorizontalAlignment="Center" Text=" "/>
<Button FontFamily="Wingdings" >$</Button>
</DockPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ListView Margin="18,18,20,57" Name="listView1"
GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">
<ListView.View>
<GridView>
<GridViewColumn Header="Col1" Width="100"
HeaderTemplate="{StaticResource HeaderTemplateButton}"/>
<GridViewColumn Header="Col2" Width="100"
HeaderTemplate="{StaticResource HeaderTemplateButton}"/>
</GridView>
</ListView.View>
</ListView>
<Label Height="28" Margin="22,0,20,9" Name="label1"
VerticalAlignment="Bottom">Label</Label>
</Grid>
</Window>

1 réponse

Avatar
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é.

Pourriez vous me dire comment on fait ?

Merci d'avance.
Luis.


Code XAML :
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml&quot;
Title="Window1" Height="300" Width="300">
<Window.Resources>
<DataTemplate x:Key="HeaderTemplateButton">
<DockPanel>
<TextBlock HorizontalAlignment="Center" Text="{Binding }"/>
<TextBlock HorizontalAlignment="Center" Text=" "/>
<Button FontFamily="Wingdings" >$</Button>
</DockPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ListView Margin="18,18,20,57" Name="listView1"
GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">
<ListView.View>
<GridView>
<GridViewColumn Header="Col1" Width="100"
HeaderTemplate="{StaticResource HeaderTemplateButton}"/>
<GridViewColumn Header="Col2" Width="100"
HeaderTemplate="{StaticResource HeaderTemplateButton}"/>
</GridView>
</ListView.View>
</ListView>
<Label Height="28" Margin="22,0,20,9" Name="label1"
VerticalAlignment="Bottom">Label</Label>
</Grid>
</Window>



Bonjour,

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.