2

コンボ ボックス コントロールにすべての行を表示するのではなく、表示されている項目を表示する必要があります。それをスクロールしている間に、次に表示されるアイテムをロードする必要があります。

どうやってやるの?また、仮想的にロードされているかどうかを確認するにはどうすればよいですか?

サンプル例:

public List<string> items = new List<string>();
public MainWindow()
{
  InitializeComponent();
  DataContext = this;
  for (int i = 0; i < 100000; i++)
  {
    items.Add("item"+ i.ToString());
  }
  combo.ItemsSource = items;
}

フロントエンド:

<Grid>
   <StackPanel>
      <ComboBox x:Name="combo" Width="150" HorizontalAlignment="Left" Margin="10,10,0,10" VirtualizingPanel.IsVirtualizing="True" />
    </StackPanel>
 </Grid>

リンクを参照した後:

   <ComboBox x:Name="combo" Height="100" Width="150" ScrollViewer.HorizontalScrollBarVisibility="Disabled"
               ScrollViewer.CanContentScroll="True" HorizontalAlignment="Left" Margin="10,10,0,10" 
               VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode ="Recycling" >
         <ComboBox.ItemsPanel>
              <ItemsPanelTemplate>
                   <VirtualizingStackPanel IsVirtualizing="True"
                                      VirtualizationMode="Recycling" />
              </ItemsPanelTemplate>
         </ComboBox.ItemsPanel>
    </ComboBox>
4

1 に答える 1

0

あなたがしなければならないことがいくつかあります。まず、ComboBox をクリーンアップして、ScrollViewer.ScrollChangedイベントにサブスクライブします。ComboBox プロパティの多くはデフォルトですでに設定されているため、削除できます。MaxDropDownHeight一度に表示するアイテムの数を指定するように設定することもできます。これがどのように見えるかです。

 <ComboBox x:Name="combo" ScrollViewer.ScrollChanged="combo_ScrollChanged" MaxDropDownHeight="70" Height="100" Width="150" HorizontalAlignment="Left" Margin="10,10,0,10">
     <ComboBox.ItemsPanel>
           <ItemsPanelTemplate>
                <VirtualizingStackPanel/>
           </ItemsPanelTemplate>
      </ComboBox.ItemsPanel>
 </ComboBox>

次に、アイテムを 3 つスキップするためにスクロール イベントを処理する必要があります。

    bool scrolling = false;//Used to prevent recursion
    private void combo_ScrollChanged(object sender, ScrollChangedEventArgs e)
    {         
        ComboBox cb = (ComboBox)sender; //Get the sending ComboBox
        ScrollViewer sv = cb.Template.FindName("DropDownScrollViewer", cb) as ScrollViewer; //Find the Comboxes ScrollViewr

        //If scrolling down
        if (e.VerticalChange < 0 && !scrolling)
        {
            scrolling = true; //Set to true to prevent recursion
            sv.ScrollToVerticalOffset(e.VerticalOffset - 2);//Scroll an extra 2 spaces up
            return; //Exit 

        }
        //If scrolling up
        if (e.VerticalChange > 0 && !scrolling)
        {
            scrolling = true; //Set to true to prevent recursion              
            sv.ScrollToVerticalOffset(e.VerticalOffset + 2);//Scroll an extra 2 spaces down
            return; //Exit
        }
        if (scrolling) { scrolling = false; } //Set to false to allow offsets
    }
于 2018-03-12T14:54:29.763 に答える