Nun, das, als Sie wahrscheinlich ein wenig mehr naiv ist, wo gehofft, aber es könnte man möglicherweise einen Ausgangspunkt geben. Es könnte mit etwas Refactoring tun, aber es wurde buchstäblich in 15 Minuten gemacht, also nimm es für das, was es ist, was nicht gut getestet ist oder irgendwelche WPF-Phantasien für diese Angelegenheit verwendet.
Zunächst ein einfaches Benutzersteuerelement, das nur ein TreeView Gastgeber
<UserControl x:Class="ObjectBrowser.PropertyTree"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<TreeView Name="treeView1" TreeViewItem.Expanded="treeView1_Expanded" />
</Grid>
</UserControl>
Der Code hinter hierfür haben nur eine Eigenschaft ObjectGraph
genannt, dies auf die Instanz des Objekts festgelegt wird, die Sie durchsuchen möchten.
Die Struktur wird nur mit der ersten Eigenschaftsebene geladen. Jeder Knoten hat das Format Eigenschaftsname: Wert oder Eigenschaftsname: Typ, wenn die Eigenschaft ein primitiver Typ ist (siehe Funktion IsPrimitiv), wird der Wert angezeigt, andernfalls ein Eine leere Zeichenfolge wird als untergeordneter Knoten hinzugefügt. Das Hinzufügen der leeren Zeichenfolge zeigt dem Benutzer an, dass der Knoten ge expandiert werden kann.
Wenn der Knoten erweitert wird, wird eine schnelle Überprüfung durchgeführt, um festzustellen, ob das erste Kind eine leere Zeichenfolge ist. Wenn dies der Fall ist, wird der Knoten gelöscht und die Eigenschaften für diesen Knoten in den Baum geladen.
Also im Grunde baut diese Baumstruktur auf, wenn der Knoten erweitert wird. Dies macht wie leichter aus zwei Gründen
1- Keine Notwendigkeit Rekursion
2- Keine Notwendigkeit zur Durchführung zyklische Referenzen zu erfassen, die in der Ewigkeit oder eine Ressource erweitern erschöpft ist, das erste jemals kommt.
Die Verwendung der Steuerung ist recht einfach. Hier werde ich nur das Steuerelement auf Form setzen und dann den ObjectGraph auf eine Instanz eines Objekts setzen, ich wählte willkürlich XmlDataProvider
.
XAML
<Window x:Class="ObjectBrowser.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" xmlns:my="clr-namespace:ObjectBrowser" Loaded="Window_Loaded">
<Grid>
<my:PropertyTree x:Name="propertyTree1" />
</Grid>
</Window>
Der Code hinter
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
namespace ObjectBrowser
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var o = new XmlDataProvider();
o.Source = new Uri("http://www.stackoverflow.com");
propertyTree1.ObjectGraph = o;
}
}
}
Natürlich ist dies immer noch eine Menge Arbeit, eine spezielle Behandlung für Typen wie Arrays möglicherweise einen Mechanismus benötigen würde Ansichten zu handhaben benutzerdefinierte zu speziellen Typen usw.
Sie haben keine Ahnung, wie viel Sie mir Zeit gespart haben! Ich weiß, Kommentare sind nicht für "Danke" - aber 8 Minuten für das Kopieren und Anpassen, anstatt für 80 Minuten zu entwickeln ... Sie und Chris verdienen einen großen Dank! –
@ G.Y Kommentare wie das sind der Grund, warum ich versuche, Fragen zu SO zu beantworten. Danke ** Sie ** –
Zachary - Tolle Arbeit. Es hat mir wirklich Zeit gespart. Zum Vorteil von allen habe ich ein funktionierendes Projekt zu Codeplex hochgeladen, das hier gefunden werden kann: https://wpfobjecttreeview.codeplex.com/ –