问题
我们需要在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) 我正在使用新的 .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 的独立计算机。我不属于任何域等。
关于如何提高性能有什么想法吗?