c# - 在 C# WPF 中创建索引

标签 c# wpf binding listbox

我正在尝试创建一个索引,如下面的屏幕截图所示。这是通过简单地以编程方式将文本框添加到滚动查看器内的水平和垂直堆栈面板来完成的。但是这个解决方案非常慢。绑定(bind)大约需要 5 秒。

enter image description here

因此我测试绑定(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 框架不支持它。

预览: Preview

关于c# - 在 C# WPF 中创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33701649/

相关文章:

C# 根据绑定(bind)的文本框获取数据集列名

c# - 在 asp.net 中将三个图像合并为一个图像

c# - 带有热图的wpf bing map应用程序?

wpf - DateTimePicker wpf 工具包绑定(bind)

asp.net-mvc-3 - ASP.Net MVC 3 - 绑定(bind)包含/排除和验证

c# - 尝试通过从日期中减去日期来获取 int

c# - 应该如何使一个具有依赖项的类可以在不膨胀的情况下进行单元测试?

c# - 向 DocumentViewer 显示 Tiff 图像时出错(WPF、C#)

c# - WPF双击编辑标签

jquery解绑有必要吗? (替换元素)