هل من الممكن تجاوز ItemsPresenter لاستخدام Virtualizing StackPanel بدلاً من لوحة المكدس العادية؟
-
14-11-2019 - |
سؤال
خلفية
لدي عنصر تحكم مخصص يرث من TreeView ويتم تعديله لعرضه في نمط شبكة البيانات.المشكلة التي أراها هي الأداء عند توسيع الشجرة.هذا أمر شائع من بحثي مع Tree Views.عند الفحص باستخدام أدوات أداء WPF، لاحظت أن فئة ItemsPresenter تستخدم لوحة Stack Panel عادية بدلاً من Virtualizing Stack Panel.
فيما يلي قسم التعليمات البرمجية الذي يتم فيه استخدام ScrollContentPresenter (يظهر في الصورة).
<ScrollContentPresenter Name="PART_ScrollContentPresenter"
KeyboardNavigation.DirectionalNavigation="Local"
Content="{TemplateBinding Content}"
ContentTemplate="{TemplateBinding ContentTemplate}"
CanContentScroll="{TemplateBinding CanContentScroll}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
هنا هو القالب الذي تم تمريره.
<ControlTemplate TargetType="CommonControls:TreeListViewItem508">
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Border x:Name="item">
<Border Name="InnerBorder">
<Grid Style="{StaticResource GridBackgroundStyle}">
<Rectangle Visibility="Collapsed" Fill="#75FFFFFF" Name="UpperHighlight" />
</Grid>
</Border>
</Border>
<ItemsPresenter Grid.Row="1" Name="ItemsHost" />
</Grid>
</ControlTemplate>
سؤال
هل من الممكن إجبار مقدم العناصر على استخدام لوحة مكدس افتراضية؟
ملحوظات
- لقد حاولت بالفعل تغليف ItemsPresenter في ScrollViewer ولكن ذلك يعطي نتائج غير مرغوب فيها (أشرطة التمرير لكل صف).
- لقد قمت بترميز الخيار CanContentScroll = true كاختبار لأن هذا يؤدي إلى تعطيل المحاكاة الافتراضية عند ضبطها على false.
- عنصر التحكم هذا قيد الإنتاج ويستخدم في أماكن متعددة، لذا ليس لدي خيار الاستبدال/إعادة الكتابة/أو إجراء تعديلات كبيرة على التصميم في هذه المرحلة.أنا أتطلع فقط إلى تجاوز هذا القسم إذا أمكن.
هي موضع تقدير كبير أي اقتراحات أو خيارات.
تم الحل:
لقد قمت بتعديل نمط القالب عن طريق إضافة هذا إلى النمط وقام بتحويل لوحات المكدس إلى المحاكاة الافتراضية.
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
المحلول
حاول giveacodicetagpre.
أو giveacodicetagpre.
obtiosuly استبدال TreeView، مع اسم عنصر تحكم TreeView الخاص بك.
نأمل أن يساعد
paul
نصائح أخرى
يمكنك استخدام أ VirtualizingStackPanel
, ، ولكن كن على علم بذلك هناك ما هو أكثر من مجرد استخدام StackPanel افتراضيًا VirtualizingStackPanel
فيما يلي مثال باستخدام الكود الموجود في الرابط المنشور أعلاه والذي يسرد العناصر المطلوبة:
<ItemsControl ...
VirtualizingStackPanel.IsVirtualizing="True" <!-- this is needed -->
ScrollViewer.CanContentScroll="True" > <!-- this is needed -->
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel /> <!-- this is needed -->
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate>
<Border ...>
<ScrollViewer> <!-- this is needed -->
<ItemsPresenter />
</ScrollViewer>
</Border>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>