Bonjour,
je souhaite exécuter du code qui recalcule la position d'objets quand l'utilisateur ouvre ou ferme un noeud dans un treeview.
J'ai besoin de récupérer la position d'un item se trouvant dans le treeview pour bien placer les autre composants.
Hors quand je m'abonne aux événements TreeViewItem.Collapsed et TreeViewItem.Expanded, je récupère la position de l'item avant que le noeud s'ouvre ou se ferme et pas après.
J'ai essayé en rajoutant des UpdateLayout sur tous les composants, mais rien n'y fait, je n'arrive pas à récupérer la position de l'item après que la partie visuelle soit mise à jour.
Est-ce que quelqu'un saurait comment faire ? Merci par avance.
Voici un exemple de code qui reproduit très simplement ce le problème :
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 <Window x:Class="WpfApplication9.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <TreeView x:Name="treeView" TreeViewItem.Expanded="TreeViewItem_OnExpandedCollapsed" TreeViewItem.Collapsed="TreeViewItem_OnExpandedCollapsed"> <TreeViewItem Header="Element 1"> <TreeViewItem Header="1.1" /> <TreeViewItem Header="1.2" /> </TreeViewItem> <TreeViewItem Header="Element 2"> <TreeViewItem Header="2.1" /> <TreeViewItem Header="2.2" /> </TreeViewItem> <TreeViewItem Header="Element 3"> <TreeViewItem Header="3.1" /> <TreeViewItem Header="3.2" /> </TreeViewItem> </TreeView> </Grid> </Window>
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 using System.Windows; using System.Windows.Controls; namespace WpfApplication9 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void TreeViewItem_OnExpandedCollapsed(object sender, RoutedEventArgs e) { var tvi = (TreeViewItem)treeView.Items[2]; Point point = tvi.PointToScreen(new Point(0, 0)); // Récupération de la position de l'item dans la fenêtre MessageBox.Show(point.ToString()); // Il affiche la position avant mise à jour de l'interface } } }
Partager