我正在尝试创建一个索引,如下面的屏幕截图所示。这是通过简单地以编程方式将文本框添加到滚动查看器内的水平和垂直堆栈面板来完成的。但是这个解决方案非常慢。绑定(bind)大约需要 5 秒。
因此我测试绑定(bind)一个List<>
将整个数据直接包含到 ListBox
.我尝试了 ItemTemplates
的各种组合但即使使用 VirtualizingPanel.IsVirtualizing="True"
我无法加快绑定(bind)速度。只有一个简单的 ListBox
没有任何分组尝试就完成了这项工作。
这是我用于所有测试的唯一 XML 部分:
<StackPanel Orientation="Horizontal" Margin="0,0,0,5">
<TextBlock Text="{Binding Name}" Style="{DynamicResource HoverUnderlineStyle}" MouseLeftButtonUp="...">
<TextBlock.ContextMenu>
<ContextMenu>
<!-- ... -->
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat=" ({0})">
<Binding Path="Count"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
如果有人能帮助我,那就太好了。 提前致谢!
最佳答案
我认为这应该可行: 主窗口.xaml
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<Grid>
<ListBox DisplayMemberPath="Value"
ItemsSource="{Binding CollectionView}"
ScrollViewer.HorizontalScrollBarVisibility="Visible"
ScrollViewer.VerticalScrollBarVisibility="Visible">
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock FontWeight="Bold" Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</GroupStyle.Panel>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
</Grid>
View 模型:
class MainViewModel
{
private static readonly Random Random = new Random();
public MainViewModel()
{
var list = new List<string>();
for (int i = 0; i < 2000; i++)
{
list.Add(RandomString(8));
}
CollectionView =
CollectionViewSource.GetDefaultView(list.OrderBy(x => x[0]).Select(x => new TestItem {Value = x}));
CollectionView.GroupDescriptions.Add(new PropertyGroupDescription("Value", new FirstLetterConverter()));
}
public ICollectionView CollectionView { get; set; }
public static string RandomString(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[Random.Next(s.Length)]).ToArray());
}
}
public class TestItem
{
public string Value { get; set; }
}
public class FirstLetterConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string s = value as string;
if (!string.IsNullOrEmpty(s))
return s.Substring(0, 1);
return string.Empty;
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
}
如果这对您来说太慢了,您可以搜索支持虚拟化的包装面板,因为 .net 框架不支持它。
关于c# - 在 C# WPF 中创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33701649/