我有一个虚拟ItemsControl与标签或文本框的列表。由于数据量大,需要虚拟化。现在我想通过与键盘的聆听选项卡。这很好,直到它到达可见列表的末尾。比焦点离开列表。有没有办法“滚动”下一个可调焦控件的列表?问题是不是列表中的每个项目都有一个可调焦的控件。通过虚拟化ItemControl /列表挂钩
下面是一个例子:
有没有什么有效的解决方案?例如,加载10个可见的项目。或者找到上次加载的可调焦项目并按代码滚动。或者在显示列表后在背景中显示所有数据。内存不是瓶颈,它是列表的渲染时间。
我按照这些Virtualizing an ItemsControl?
这里是行不通例如
<ItemsControl DockPanel.Dock="Top" x:Name="lb" Height="200" ItemsSource="{Binding testList}"
KeyboardNavigation.TabNavigation="Cycle"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
ScrollViewer.CanContentScroll="True"
AlternationCount="4"
>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel IsItemsHost="True" Orientation="Vertical" x:Name="virtualizingStackPanel" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Path=., Mode=OneWay}" Name="txtTest">
<TextBox.Style>
<Style TargetType="TextBox">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</TextBox.Style>
</TextBox>
<Label >space</Label>
</StackPanel>
<DataTemplate.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Visibility" Value="visible" TargetName="txtTest"/>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Template>
<ControlTemplate>
<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}" Name="presenter"/>
</ScrollViewer>
</Border>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
代码隐藏
public List<string> testList {
get
{
List< string> a = new List<string>();
for (int i = 0; i < 10000; i++)
{
a.Add(i.ToString());
}
return a;
}
}
与KeyboardNavigation.TabNavigation =“周期”的重点转到“可见”列表中的第一个元素,但不包含真实列表中的下一个元素 – Alex
适用于我的示例。你甚至尝试过吗?你也应该阅读:https://stackoverflow.com/help/how-to-ask – mm8
是的,我试过这些。你的例子工作。但在我的项目中没有evey项目有一个可以控制的焦点。在我的帖子中看到我的不工作示例 – Alex