【问题标题】:Creating an index in c# WPF在 c# WPF 中创建索引
【发布时间】:2015-11-13 20:58:27
【问题描述】:

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

因此我测试了将包含整个数据的List<> 直接绑定到ListBox。我尝试了ItemTemplates 的各种组合,但即使使用VirtualizingPanel.IsVirtualizing="True",我也无法加快绑定速度。只有一个简单的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>

如果有人能帮助我,那就太好了。 提前致谢!

【问题讨论】:

  • 哪个控件应该包含文本?文本块还是文本框? (您编写了 TextBox,但在屏幕截图中它们看起来像文本块)。您是否希望这些项目可以选择?
  • 哦对不起这个错误!一个 TextBlock,是的,这些项目应该是可选择的。
  • 真正的问题是什么,您是否要求性能更好的解决方案?
  • @tron 您要显示的数据很多,因此需要绘制很多控件。如此多的数据,人脑无法一次处理所有数据。为什么不通过搜索让用户更容易找到某人,或者在折叠状态下开始组。我不知道,不会导致信息过载的东西。
  • 此外,样式会对渲染时间产生重大影响。最后,您还可以查看如何使用 HeaderedItemsControl 或自定义 ItemsControl,具体取决于您是否需要可点击或可选择的项目(存在差异)。

标签: c# wpf binding listbox


【解决方案1】:

我认为这应该可行: MainWindow.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>

视图模型:

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 框架不支持。

预览:

【讨论】:

  • 感谢您的回答。我会测试它。
【解决方案2】:

在没有看到您的其余代码的情况下,我可以指出对您的 Xaml 的一些改进:

  1. 尝试使用StaticResource 而不是DynamicResource
  2. 第二个文本块中不需要MultiBinding。实际上,您可以使用单个 TextBlock 和多个 Runs,并去掉 StackPanel
<TextBlock Style="{StaticResource HoverUnderlineStyle}" MouseLeftButtonUp="...">
    ...
    <Run Text="{Binding Name}"/>
    <Run Text="{Binding Count, StringFormat={} ({0})}"/>
</TextBlock>

【讨论】:

    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2011-10-28
    • 2020-10-08
    • 1970-01-01
    相关资源
    最近更新 更多