小编Ade*_*zah的帖子

WPF ListBox虚拟化会搞砸所显示的项目

问题

我们需要在WPF ListBox控件中有效地显示大量(> 1000)个对象.我们依靠WPF ListBox的虚拟化(通过VirtualizingStackPanel)来有效地显示这些项目.

错误:使用虚拟化时,WPF ListBox控件无法正确显示项目.

如何再现

我们已将问题提炼到下面显示的独立xaml中.

将xaml复制并粘贴到XAMLPad中.

最初,ListBox中没有选定的项目,因此按预期,所有项目大小相同,并且它们完全填充可用空间.

现在,单击第一个项目.正如预期的那样,由于我们的DataTemplate,所选项目将展开以显示其他信息.

正如预期的那样,这会导致水平滚动条出现,因为所选项目现在比可用空间更宽.

现在使用鼠标单击并将水平滚动条拖动到右侧.

错误:未选择的可见项目不再拉伸以填充可用空间.所有可见项目的宽度应相同.

这是一个已知的错误?有没有办法通过XAML或以编程方式解决这个问题?


<Page 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Page.Resources>

        <DataTemplate x:Key="MyGroupItemTemplate">
            <Border Background="White"
                    TextElement.Foreground="Black"
                    BorderThickness="1"
                    BorderBrush="Black"
                    CornerRadius="10,10,10,10"
                    Cursor="Hand"
                    Padding="5,5,5,5"
                    Margin="2"
                    >
                <StackPanel>
                    <TextBlock Text="{Binding Path=Text, FallbackValue=[Content]}" />
                    <TextBlock x:Name="_details" Visibility="Collapsed" Margin="0,10,0,10" Text="[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]" />
                </StackPanel>
            </Border>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}"
                             Value="True">
                    <Setter Property="TextElement.FontWeight"
                            TargetName="_details"
                            Value="Bold"/>
                    <Setter Property="Visibility"
                            TargetName="_details"
                            Value="Visible"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>

    </Page.Resources>

    <DockPanel x:Name="LayoutRoot">

        <Slider x:Name="_slider"
                DockPanel.Dock="Bottom" 
                Value="{Binding FontSize, ElementName=_list, Mode=TwoWay}" 
                Maximum="100" …
Run Code Online (Sandbox Code Playgroud)

wpf virtualization listbox

9
推荐指数
1
解决办法
5151
查看次数

AccountManagement.UserPrincipal.Current 需要 5 秒

我正在使用新的 .NET 3.5 System.DirectoryServices.AccountManagement API

在我的代码中,我需要确定当前的 System.DirectoryServices.AccountManagement.UserPrincipal。

我天真的做法是这样做:

using AccountManagement = System.DirectoryServices.AccountManagement;

...

// Determine current UserPrincipal.
// (On my machine, this blocks for 5 seconds)
//

AccountManagement.UserPrincipal principal = AccountManagement.UserPrincipal.Current;
Run Code Online (Sandbox Code Playgroud)

我的计算机是运行 Vista 的独立计算机。我不属于任何域等。

关于如何提高性能有什么想法吗?

.net

1
推荐指数
1
解决办法
3654
查看次数

标签 统计

.net ×1

listbox ×1

virtualization ×1

wpf ×1