هل من الممكن تجاوز ItemsPresenter لاستخدام Virtualizing StackPanel بدلاً من لوحة المكدس العادية؟

StackOverflow https://stackoverflow.com/questions/9503433

سؤال

خلفية

لدي عنصر تحكم مخصص يرث من TreeView ويتم تعديله لعرضه في نمط شبكة البيانات.المشكلة التي أراها هي الأداء عند توسيع الشجرة.هذا أمر شائع من بحثي مع Tree Views.عند الفحص باستخدام أدوات أداء WPF، لاحظت أن فئة ItemsPresenter تستخدم لوحة Stack Panel عادية بدلاً من Virtualizing Stack Panel.

enter image description here

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