Come faccio a scorrere tutti i controlli in una finestra in WPF?WPF: Come faccio a scorrere tutti i controlli in una finestra?
risposta
classe per ottenere una lista di tutti i componenti dei bambini di un controllo:
class Utility
{
private static StringBuilder sbListControls;
public static StringBuilder GetVisualTreeInfo(Visual element)
{
if (element == null)
{
throw new ArgumentNullException(String.Format("Element {0} is null !", element.ToString()));
}
sbListControls = new StringBuilder();
GetControlsList(element, 0);
return sbListControls;
}
private static void GetControlsList(Visual control, int level)
{
const int indent = 4;
int ChildNumber = VisualTreeHelper.GetChildrenCount(control);
for (int i = 0; i <= ChildNumber - 1; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(control, i);
sbListControls.Append(new string(' ', level * indent));
sbListControls.Append(v.GetType());
sbListControls.Append(Environment.NewLine);
if (VisualTreeHelper.GetChildrenCount(v) > 0)
{
GetControlsList(v, level + 1);
}
}
}
}
Il looping attraverso l'albero logico non è migliore e più efficace del loop attraverso l'albero visivo. – MegaMind
'sbListControls' dovrebbe essere una variabile locale, nel caso in cui questi metodi vengano chiamati contemporaneamente da più thread. –
ho trovato questo nel MSDN documenation in modo che aiuta.
// Enumerate all the descendants of the visual object.
static public void EnumVisual(Visual myVisual)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
{
// Retrieve child visual at specified index value.
Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);
// Do processing of the child visual object.
// Enumerate children of the child visual object.
EnumVisual(childVisual);
}
}
Sembra più semplice per me. L'ho usato per trovare caselle di testo in un modulo e cancellare i loro dati.
Ho pubblicato un'altra risposta basata su questo che restituisce effettivamente un 'IEnumerable
Quando provo a riprodurlo, viene visualizzato un errore su myVisual (ad esempio .GetChildrenCount (** myVisual **) & .GetChild (** myVisual **, i)) che dice "impossibile convertire da" Windows.UI.Composition.Visual 'a' Windows.UI.Xaml.DependencyObject '"? Le soluzioni WPF funzionano nell'ambiente UWP? Sto usando la direttiva using errata (Windows.UI.Composition)? – gaw
Una leggera variazione della risposta MSDN ... basta passare in un vuoto elenco di oggetti visivi in esso e la vostra collezione sarà popolata con tutte le immagini del bambino:
/// <summary>
/// Enumerate all the descendants (children) of a visual object.
/// </summary>
/// <param name="parent">Starting visual (parent).</param>
/// <param name="collection">Collection, into which is placed all of the descendant visuals.</param>
public static void EnumVisual(Visual parent, List<Visual> collection)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
// Get the child visual at specified index value.
Visual childVisual = (Visual)VisualTreeHelper.GetChild(parent, i);
// Add the child visual object to the collection.
collection.Add(childVisual);
// Recursively enumerate children of the child visual object.
EnumVisual(childVisual, collection);
}
}
Ho pubblicato un'altra risposta basata sul tuo che restituisce effettivamente un 'IEnumerable
In questo modo è superiore al Metodo MSDN, in quanto riutilizzabile e consente l'interruzione anticipata del ciclo (ad esempio tramite, break;
, ecc.), Ottimizza il ciclo for in quanto salva una chiamata al metodo per ogni iterazione e consente inoltre di utilizzare regolare per cicli di loop attraverso i figli di un Visual, o anche recitare i suoi figli ed è grandioso - quindi è molto più semplice da consumare.
Per consumarlo, si può semplicemente scrivere un ciclo foreach regolare (o anche usare LINQ):
foreach (var ctrl in myWindow.GetChildren())
{
// Process children here!
}
O se non si vuole ricorsione:
foreach (var ctrl in myWindow.GetChildren(false))
{
// Process children here!
}
Per rendere più lavoro, basta mettere questo metodo di estensione in qualsiasi classe statica, quindi sarete in grado di scrivere codice simile al momento di cui sopra che ti piace:
public static IEnumerable<Visual> GetChildren(this Visual parent, bool recurse = true)
{
if (parent != null)
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
// Retrieve child visual at specified index value.
var child = VisualTreeHelper.GetChild(parent, i) as Visual;
if (child != null)
{
yield return child;
if (recurse)
{
foreach (var grandChild in child.GetChildren(true))
{
yield return grandChild;
}
}
}
}
}
}
Inoltre, se la ricorsione non è attiva per impostazione predefinita, è possibile modificare la dichiarazione del metodo di estensione in modo che il comportamento predefinito sia recurse = false
.
Ho usato quanto segue per ottenere tutti i controlli.
public static IList<Control> GetControls(this DependencyObject parent)
{
var result = new List<Control>();
for (int x = 0; x < VisualTreeHelper.GetChildrenCount(parent); x++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, x);
var instance = child as Control;
if (null != instance)
result.Add(instance);
result.AddRange(child.GetControls());
}
return result;
}
- 1. Come posso allineare rapidamente i controlli in una finestra WPF?
- 2. jQuery: come faccio a scorrere tutti gli elementi 'a'?
- 3. Come faccio a scorrere tutti i file in una cartella usando C?
- 4. Come scegliere come target tutti i controlli (stili WPF)
- 5. Come faccio a scorrere i tag in un messaggio jekyll?
- 6. Come utilizzare i controlli personalizzati in WPF
- 7. Come faccio a scorrere i membri della classe?
- 8. Come faccio a unire tutti i casi in Uno?
- 9. finestre SlimDX a controlli WPF
- 10. Come faccio a scorrere un ScrollViewer in Design Time in Blend
- 11. Come faccio a cambiare a livello di codice il titolo in una finestra wpf?
- 12. WPF utilizzando ResizeGrip per ridimensionare i controlli
- 13. WPF: come carico i controlli utente in modo dinamico?
- 14. C# Come faccio a scorrere il registro?
- 15. come faccio a scorrere i campi di un oggetto?
- 16. Riduci a icona una finestra in WPF?
- 17. Come faccio a far scorrere un tavolo
- 18. WPF: come rendere estesi i controlli in uno StackPanel?
- 19. Come ricevere una notifica quando una finestra viene messa a fuoco in WPF?
- 20. Come faccio a forzare JScrollPane a scorrere solo in verticale?
- 21. Script PHP per scorrere tutti i file in una directory?
- 22. Come faccio a sapere che cosa è una finestra WPF in
- 23. WPF Tooltip con controlli
- 24. Come faccio a scorrere questo oggetto JSON in jQuery?
- 25. scorrere tutti i file Word in Directory
- 26. Come faccio ad allineare i controlli in uno StatusStrip?
- 27. Come faccio a scorrere i valori di una riga da un set di risultati in java?
- 28. Come impostare un Margine predefinito per tutti i controlli su tutte le mie finestre WPF?
- 29. Controlli WPF - Il codice deve essere evitato a tutti i costi?
- 30. Come faccio a scorrere un oggetto SimpleXML in PHP
Questo link potrebbe essere un buon punto di partenza: http://msdn.microsoft.com/en-us/library/bb613556.aspx – VVS
si può trovare la risposta in: http://stackoverflow.com/questions/974598/find-all-controls-in-wpf-window-by-type –