Frage

Wie kann man erhält die Platte, die innerhalb eines TreeView verwendet wird? Ich habe standardmäßig TreeView verwendet einen VirtualizingStackPanel dafür lesen, dass. Als ich an einer TreeView Vorlage sehen, alles, was ich sehe, ist , die die Details, was Tafel verwendet wird, zu verbergen scheint.

Mögliche Lösungen:

1) Auf der Treeview-Instanz ( "tv"), von Code, dies zu tun:. Tv.ItemsPanel

Das Problem ist, das nicht wieder eine Platte, sondern ein Itemspaneltemplate ( „Ruft die Vorlage, die definiert die Platte, dass die Kontrollen des Layout der Elemente“).

2) Machen Sie eine TreeView-Vorlage, die explizit ersetzt mit Ihrem eigenen ItemsControl.ItemsPanel. Ich reiche eine spezielle Vorlage sowieso, so dass diese in Ordnung in meinem Szenario ist. Dann geben Sie an der Platte, einen Namen, dass Sie innerhalb dieser Vorlage zu platzieren, und von Code können Sie, dass ein Teil (das heißt die Platte) erhalten. Das Problem dabei? siehe unten.

(Ich verwende ein Steuerelement mit dem Namen VirtualTreeView, die von TreeView abgeleitet wird, wie weiter unten zu sehen ist):

<ControlTemplate x:Key="VirtualTreeViewTemplate" TargetType="{x:Type local:VirtualTreeView}">
    <Border>
        <local:VirtualScrollViewer 
             Style="{StaticResource VirtualScrollViewer}"
             x:Name="PART_VirtualScrollViewer"
                    CanContentScroll="True">
                <!-- instead of: <ItemsPresenter />, use following: -->
                <ItemsControl>
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel
                            Name="PART_ItemsStackPanel"
                            IsItemsHost="True" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ItemsControl>
        </local:VirtualScrollViewer>
    </Border>
</ControlTemplate>

[I gezupft alle Unordnung hier für die Sichtbarkeit ...]

Das Problem dabei ist: dies sofort überschreibt alle TreeView Layout-Mechanismus. Eigentlich bekommt man nur einen leeren Bildschirm, auch wenn Sie TreeViewItems Füllen des Baumes haben. Nun, der Grund, warum ich einen Halt der Platte bekommen möchten, ist nehmen einige an der MeaureOverride, aber ohne all das geht in, ich sicherlich nicht wollen, dass das Buch, wie man das Layout neu zu schreiben ein treeview. Das heißt, dies ist der Schritt zu tun # 2 Weg scheint den Punkt sogar mit einem TreeView in erster Linie ungültig zu machen.

Sorry, wenn es einige Verwirrung hier, vielen Dank für jede Hilfe können Sie anbieten.

War es hilfreich?

Lösung

Es gibt eine Klasse namens VisualTreeHelper, die Sie erlaubt nicht exponierten Kind Kontrollen zu bekommen / Elemente einer Kontrolle.

Hier ist ein Link auf die GetChild Methode für diese Klasse mit dem Sie alle Kinder aufzählen können, etc:

http://msdn.microsoft .com / de-de / library / system.windows.media.visualtreehelper.getchild.aspx

Andere Tipps

Im Folgenden ist eine Ergänzung zur Antwort von David oben. Dies bietet eine Möglichkeit, alle Visual Kinder zu bekommen, die UIElements über ein Verlängerungsverfahren sind.

public static class WPFXtensions
{
    static public IEnumerable<UIElement> GetDescendantUIElements(this UIElement uiElement)
    {
        int childrenCnt = VisualTreeHelper.GetChildrenCount(uiElement);
        for (int i = 0; i < childrenCnt; i++)
        {
            Visual childVisual = VisualTreeHelper.GetChild(uiElement, i) as Visual;

            if(childVisual == null)
                continue;   

            if (childVisual is UIElement)
            {
                yield return childVisual as UIElement;

                // note: by recursively calling within the loop, we walk the tree all the way down for each
                // UIElement encountered before moving to the next UIElement sibling. 
                foreach (UIElement e in GetDescendantUIElements(childVisual as UIElement))
                    yield return e;
            }
        }
    }
}

 // Use this then like this to retrieve an expected child StackPanel 

StackPanel sp1 = (StackPanel)this.GetDescendantUIElements()
            .First(uiElem => uiElem is StackPanel);

// Get all of this UIElement's descendants (for a diagnostic look); 
// In a run where this was a TreeView, 78 UIElements returned

List<UIElement> uiElements = this.GetDescendantUIElements().ToList();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top