سؤال

كيف يمكن للمرء الحصول على اللوحة التي يتم استخدامها ضمن أ TreeView؟ لقد قرأت ذلك بشكل افتراضي TreeView يستخدم VirtualizingStackPanel لهذا. عندما أنظر إلى أ TreeView القالب ، كل ما أراه هوu003CItemsPresenter /> ، والذي يبدو أنه يخفي تفاصيل اللوحة المستخدمة.

الحلول الممكنة:

1) على مثيل TreeView ("TV") ، من الكود ، قم بذلك: TV.ItemSpanel.

المشكلة هي أن هذا لا يعيد لوحة ، ولكن العناصر spaneltemplate ("يحصل أو تعيين القالب الذي يحدد اللوحة التي تتحكم في تخطيط العناصر").

2) قم بعمل قالب TreeView الذي يستبدل صراحةu003CItemsPresenter /> مع العناصر الخاصة بك control.itemspanel. أنا أقدم قالبًا خاصًا على أي حال ، لذلك هذا جيد في السيناريو. ثم أعط اسم جزء إلى اللوحة التي تضعها داخل هذا القالب ، ومن الرمز يمكنك الحصول على هذا الجزء (أي اللوحة). المشكلة مع هذا؟ انظر أدناه.

(أنا أستخدم عنصر تحكم يدعى VirtualTreeView مشتق من TreeView ، كما هو موضح أدناه):

<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>

جردت كل الفوضى هنا للرؤية ...

المشكلة في هذا هي: هذا يتجاوز على الفور أي آلية تخطيط TreeView. في الواقع ، يمكنك الحصول على شاشة فارغة ، حتى عندما يكون لديك TreeViewItems تملأ الشجرة. حسنًا ، السبب في أنني أرغب في الحصول على لوحة بعض جزء في Meaurovride ، ولكن دون الدخول في كل ذلك ، بالتأكيد لا أريد إعادة كتابة كتاب كيفية تخطيط TreeView. أي ، يبدو أن طريقة الخطوة رقم 2 تبطل نقطة حتى استخدام TreeView في المقام الأول.

آسف إذا كان هناك بعض الالتباس هنا ، شكرًا على أي مساعدة يمكنك تقديمها.

هل كانت مفيدة؟

المحلول

هناك فصل يسمى VisualTreeHelper يتيح لك ذلك الحصول على ضوابط/عناصر الأطفال غير المعرضين للسيطرة.

هنا رابط إلى GetChild الطريقة في تلك الفئة التي تتيح لك تعداد جميع الأطفال ، إلخ:

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

نصائح أخرى

فيما يلي مكمل للإجابة التي قدمها ديفيد أعلاه. هذا يوفر وسيلة للحصول على جميع الأطفال البصريين UIElementS عبر طريقة تمديد.

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();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top