Quando si espande gli elementi nella vista albero in modo che lo scorrimento sia necessario, viene visualizzata una barra di scorrimento. Tuttavia, non scorre verso il basso per il ramo appena espanso di elementi: vengono ritagliati nella parte inferiore del controllo. Quindi, mentre continuo ad espandere gli oggetti nella parte inferiore dell'albero, devo continuare a scorrere manualmente verso il basso per vedere i nuovi bambini. Qualcuno ha un suggerimento su come farlo scorrere automaticamente per mostrare gli elementi appena espansi?WPF TreeView - Come scorrere in modo che il ramo espanso sia visibile
risposta
In TreeView, gestire l'evento TreeViewItem.Expanded (è possibile farlo a livello di TreeView a causa del bubbling degli eventi). Nel gestore espanso, chiama BringIntoView sull'oggetto TreeViewItem che ha generato l'evento.
Potrebbe essere necessario un po 'di tentativi ed errori per ottenere TreeViewItem nel codice del gestore di eventi. Penso (non ho controllato) che l'argomento del mittente per il gestore di eventi espanso sarà TreeView (poiché è lì che è collegato il gestore di eventi) piuttosto che TreeViewItem. E e.Source o e.OriginalSource può essere un elemento nel modello di dati di TreeViewItem. Quindi potresti aver bisogno di usare VisualTreeHelper per salire la struttura visuale per trovare TreeViewItem. Ma se si usa il debugger per ispezionare il mittente e RoutedEventArgs, questo dovrebbe essere banale da capire.
(Se riesci a farlo funzionare e vuoi raggrupparlo in modo da non dover collegare lo stesso gestore di eventi a ogni TreeView, dovrebbe essere facile incapsularlo come un attached behaviour che ti permetterà . per applicarlo in modo dichiarativo, anche attraverso uno stile)
Grazie alla risposta di itowlson, ecco il codice del gestore eventi esteso che funziona per entrambi i miei alberi
private static void Tree_Expanded(object sender, RoutedEventArgs e)
{
// ignore checking, assume original source is treeviewitem
var treeViewItem = (TreeViewItem)e.OriginalSource;
var count = VisualTreeHelper.GetChildrenCount(treeViewItem);
for (int i = count - 1; i >= 0; --i)
{
var childItem = VisualTreeHelper.GetChild(treeViewItem, i);
((FrameworkElement)childItem).BringIntoView();
}
// do NOT call BringIntoView on the actual treeviewitem - this negates everything
//treeViewItem.BringIntoView();
}
Qual è la parte XAML per questo per favore? Ho provato ad adattare alcuni altri frammenti XAML da questa pagina ma non funzionerebbe per un errore che non capisco. – ygoe
Non importa, l'ho capito. È necessario rimuovere "statico" dalla firma del metodo sopra, quindi il seguente XAML funziona:
Utilizzare una proprietà di dipendenza su un grilletto IsSelected:
<Style TargetType="{x:Type TreeViewItem}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="commands:TreeViewItemBehavior.BringIntoViewWhenSelected" Value="True" />
</Trigger>
</Style.Triggers>
Ecco il codice della proprietà di dipendenza:
public static bool GetBringIntoViewWhenSelected(TreeViewItem treeViewItem)
{
return (bool)treeViewItem.GetValue(BringIntoViewWhenSelectedProperty);
}
public static void SetBringIntoViewWhenSelected(TreeViewItem treeViewItem, bool value)
{
treeViewItem.SetValue(BringIntoViewWhenSelectedProperty, value);
}
public static readonly DependencyProperty BringIntoViewWhenSelectedProperty =
DependencyProperty.RegisterAttached("BringIntoViewWhenSelected", typeof(bool),
typeof(TreeViewItemBehavior), new UIPropertyMetadata(false, OnBringIntoViewWhenSelectedChanged));
static void OnBringIntoViewWhenSelectedChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
TreeViewItem item = depObj as TreeViewItem;
if (item == null)
return;
if (e.NewValue is bool == false)
return;
if ((bool)e.NewValue)
item.BringIntoView();
}
Questa soluzione funziona anche quando si imposta la selezione dal codice. Le altre varianti funzionano solo se si preme manualmente su un nodo dall'albero. – alexandrudicu
Questo è fantastico, ha funzionato come un fascino! –
Ci dovrebbe essere almeno un riferimento alla fonte originale: [Introduzione ai comportamenti associati in WPF] (https://www.codeproject.com/Articles/28959/Introduzione-Attached-Behaviors-in-WPF) – bokibeg
È possibile utilizzare un semplice EventSetter in stile TreeViewItem per invocare un gestore di eventi quando si seleziona la voce. Quindi chiama BringIntoView per l'oggetto.
Downvoted questo per errore; scusa.Questo è quello che succede quando un gatto cammina sulla tua tastiera. Hanno bisogno di un filtro per gatti su SO. :-) –
- 1. Scorri UITableView in modo che l'intestazione non sia visibile
- 2. WPF TreeView Clear Selection
- 3. AutoExpand treeview in WPF
- 4. Come allineare il pulsante su wpf treeview
- 5. WPF: Custom + - in TreeView
- 6. Abilita scorrimento per WPF Treeview
- 7. come appiattire un WPF TreeView
- 8. WPF DataBound treeview expand/collapse
- 9. WPF TreeView che perde l'elemento selezionato
- 10. Java; Ottenere inserimenti prima che il frame sia visibile
- 11. WPF TreeView refreshing
- 12. WPF TreeView Virtualization
- 13. assicurarsi che il titolo sia completamente visibile su JOptionPane
- 14. Linee tra i nodi in WPF TreeView
- 15. Come scrollare in modo affidabile TreeView virtuale verso il basso?
- 16. Intestazione colonna per WPF TreeView
- 17. WPF: virtualizzazione TreeView non funzionante
- 18. Raggruppamento di oggetti figlio in WPF TreeView
- 19. Raggruppamento di dati in WPF treeview
- 20. Icona Bind seconda Enum in WPF TreeView
- 21. Come filtrare una gerarchia di treeview wpf usando un ICollectionView?
- 22. Come posso scorrere un div per essere visibile in ReactJS?
- 23. Scorrere mentre si trascina e rilascia (WPF)
- 24. In che modo Lisp può essere sia dinamico sia compilato?
- 25. scorrimento in virtualizzato WPF TreeView è molto instabile
- 26. wpf imposta l'ordinamento a livello di codice, in modo che l'intestazione sia commutata come ordinata
- 27. Salvare lo stato WPF TreeView sui dati di ricarica
- 28. WPF TreeView: dove si trova il metodo ExpandAll()
- 29. Come posso far scorrere il mio layout sia orizzontalmente che verticalmente?
- 30. Errore di convalida dell'espansione WPF non mostrato quando espanso
Che funziona perfettamente, ho pensato che ci sarebbe stato un problema perché voglio concentrarmi sugli elementi figlio espansi, non sull'elemento espanso, ma funziona esattamente come volevo. Grazie mille anche per il suggerimento comportamentale allegato, ancora meglio. – Jared
In realtà questo funziona per il mio albero in cui completamente sovrascrivo il modello treeviewitem, ma non funziona per la mia vista ad albero più semplice in cui utilizzo il modello treeviewitem predefinito ... non so perché – Jared