একটি আইটেমকন্ট্রোল ভার্চুয়ালাইজিং?


125

আমার কাছে ItemsControlডেটাগুলির একটি তালিকা রয়েছে যা আমি ভার্চুয়ালাইজ করতে চাই, তবে VirtualizingStackPanel.IsVirtualizing="True"এটি কোনওর সাথে কাজ করে বলে মনে হয় না ItemsControl

এটি কি আসলেই আছে বা এটি করার অন্য কোনও উপায় আছে যা সম্পর্কে আমি অবগত নই?

পরীক্ষার জন্য আমি নিম্নলিখিত কোডের ব্লকটি ব্যবহার করছি:

<ItemsControl ItemsSource="{Binding Path=AccountViews.Tables[0]}"
              VirtualizingStackPanel.IsVirtualizing="True">
<ItemsControl.ItemTemplate>
    <DataTemplate>
        <TextBlock Initialized="TextBlock_Initialized"  
                   Margin="5,50,5,50" Text="{Binding Path=Name}" />
    </DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

যদি আমি পরিবর্তন ItemsControlএকটি থেকে ListBox, আমি দেখতে পারেন Initializedঘটনা শুধুমাত্র সময়ের একটি থাবা রান (ঠিক তাই আমি মাত্র কয়েক রেকর্ড মধ্য দিয়ে যেতে বিশাল মার্জিন হয়) তবে হিসাবে একটি ItemsControlপ্রতিটি আইটেম সক্রিয়া পায়।

আমি সেটিং চেষ্টা করেছি ItemsControlPanelTemplateএকটি করতে VirtualizingStackPanelকিন্তু যে সাহায্যের বলে মনে হচ্ছে না।

উত্তর:


219

এটি ItemsPanelTemplateব্যবহারের চেয়ে আরও অনেক কিছুই আছে VirtualizingStackPanel। এর ControlTemplateজন্য ডিফল্টটিতে ItemsControlএকটি নেই ScrollViewerযা ভার্চুয়ালাইজেশনের মূল চাবিকাঠি। ItemsControl( টেমপ্লেট হিসাবে নিয়ন্ত্রণ টেম্পলেট ব্যবহার করে) এর জন্য ডিফল্ট নিয়ন্ত্রণ টেম্পলেটটিতে যুক্ত করা ListBoxআমাদের নিম্নলিখিত দেয়:

<ItemsControl ItemsSource="{Binding AccountViews.Tables[0]}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <TextBlock Initialized="TextBlock_Initialized"
                 Text="{Binding Name}" />
    </DataTemplate>
  </ItemsControl.ItemTemplate>

  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <VirtualizingStackPanel IsVirtualizing="True"
                              VirtualizationMode="Recycling" />
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>

  <ItemsControl.Template>
    <ControlTemplate TargetType="ItemsControl">
      <Border BorderThickness="{TemplateBinding BorderThickness}"
              BorderBrush="{TemplateBinding BorderBrush}"
              Background="{TemplateBinding Background}">
        <ScrollViewer CanContentScroll="True" 
                      Padding="{TemplateBinding Padding}"
                      Focusable="False">
          <ItemsPresenter />
        </ScrollViewer>
      </Border>
    </ControlTemplate>
  </ItemsControl.Template>
</ItemsControl>

(বিটিডাব্লু, ডিফল্ট নিয়ন্ত্রণ টেম্পলেটগুলি দেখার জন্য দুর্দান্ত সরঞ্জাম হ'ল আমাকে দ্য টেম্পলেটটি দেখান )

লক্ষ্য করার বিষয়গুলি:

আপনাকে সেট করতে হবে ScrollViewer.CanContentScroll="True", কেন এখানে দেখুন ।

আমি রাখি তাও লক্ষ্য করুন VirtualizingStackPanel.VirtualizationMode="Recycling"। এটি বারের সংখ্যাটি হ্রাস করবে TextBlock_Initializedযদিও অনেকগুলি পাঠ্যব্লকগুলি স্ক্রিনে দৃশ্যমান। আপনি এখানে ইউআই ভার্চুয়ালাইজেশনে আরও পড়তে পারেন ।

সম্পাদনা করুন: সুস্পষ্ট রাষ্ট্র ভুলে গেছেন: একটি বিকল্প সমাধান হিসেবে, আপনি শুধু প্রতিস্থাপন করতে পারেন ItemsControlসঙ্গে ListBox, :) এছাড়াও এই চেক আউট দুটিই MSDN পৃষ্ঠাতে নিখুঁত পারফরমেন্স এবং যে বিজ্ঞপ্তি ItemsControlনেই "নিয়ন্ত্রণ পারফরমেন্স বাস্তবায়ন যে বৈশিষ্ট্য" সারণী, যা কেন আমাদের নিয়ন্ত্রণ টেম্পলেটটি সম্পাদনা করতে হবে।


1
আপনাকে ধন্যবাদ, আমি ঠিক সেই ধরণের জিনিসটি খুঁজছিলাম! আমি একটি তালিকা বাক্সের চেয়ে আলাদা ধরণের নির্বাচনের আচরণের সন্ধান করছিলাম এবং এমন সময় আমি ভেবেছিলাম আইটেম নিয়ন্ত্রণের সাথে কাজ করা সবচেয়ে সহজ হবে।
রাচেল

যদি এই আইটেমসন্ট্রোলটি আরও ঘৃণিত হয় তবে আপনার এটির উচ্চতাও দেওয়া উচিত। অন্যথায় স্ক্রোলভিউয়ারটি প্রদর্শিত হয় না।
বাকলি 21

9
"এছাড়াও লক্ষ্য করুন যে আমি ভার্চুয়ালাইজিংস্ট্যাকপ্যানেল রেখেছি V ভার্চুয়ালাইজেশন মোড = পুনর্ব্যবহারযোগ্য"। আপনার দেওয়া নমুনায় এটি থাকার কথা নয় কি?
বাকলে

ভার্চুয়ালাইজেশন এছাড়াও কাজ যখন মোড়ানো করে ItemsControlমধ্যে ScrollViewerinstread যোগ Scrollকরার ControlTemplate?
ডেমো

@ ডেভিডএন কোথায় বা কীভাবে আমি আপনার সমাধানগুলিতে কলাম শিরোনাম স্থাপন করতে পারি?
ওজকান

37

ডেভিডএন এর উত্তরে বিল্ডিং, আপনি একটি আইটেমকন্ট্রোলটিতে ভার্চুয়ালাইজ করতে এটি ব্যবহার করতে পারেন style

<!--Virtualised ItemsControl-->
<Style x:Key="ItemsControlVirtualizedStyle" TargetType="ItemsControl">
    <Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
    <Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ItemsControl">
                <Border
                    BorderThickness="{TemplateBinding Border.BorderThickness}"
                    Padding="{TemplateBinding Control.Padding}"
                    BorderBrush="{TemplateBinding Border.BorderBrush}"
                    Background="{TemplateBinding Panel.Background}"
                    SnapsToDevicePixels="True"
                >
                    <ScrollViewer Padding="{TemplateBinding Control.Padding}" Focusable="False">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

আমি তালিকাবক্স ব্যবহার করার পরামর্শটি পছন্দ করি না কারণ তারা সারিগুলি যেখানে আপনি এটি চান না তা নির্বাচনের অনুমতি দেয়।


-3

এটি ঠিক যে ডিফল্টটি ItemsPanelএকটি নয় VirtualizingStackPanel। আপনার এটি পরিবর্তন করতে হবে:

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

8
সমাধানটি অসম্পূর্ণ হওয়ায় আমি এটিকে ভোট দিচ্ছি। ভার্চুয়ালাইজেশন সক্ষম করতে আপনাকে টেমপ্লেটে একটি স্ক্রোলভিউর ব্যবহার করতে হবে।
সরফ তালুকদার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.