كيفية الحصول على اللوحة داخل TreeView (WPF)
-
03-10-2019 - |
سؤال
كيف يمكن للمرء الحصول على اللوحة التي يتم استخدامها ضمن أ 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
نصائح أخرى
فيما يلي مكمل للإجابة التي قدمها ديفيد أعلاه. هذا يوفر وسيلة للحصول على جميع الأطفال البصريين UIElement
S عبر طريقة تمديد.
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();