我有一个 itemcontrol ,它有3个可能的datatemplates。
<DataTemplate>
<StackPanel>
<TextBlock
FontSize="25"
FontWeight="Light"
Margin="0,8,0,5"
Text="{Binding Name}" >
</TextBlock>
<!-- Εδω τα items -->
<ContentControl
Content="{Binding Preferences}"
Name="items" >
</ContentControl>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger
Binding="{Binding Path=SelectionMode}"
Value="1" >
<Setter
Property="ContentTemplate"
TargetName="items"
Value="{StaticResource SoloSelection}" />
</DataTrigger>
<DataTrigger
Binding="{Binding Path=SelectionMode}"
Value="2" >
<Setter
Property="ContentTemplate"
TargetName="items"
Value="{StaticResource MultiSelection}" />
</DataTrigger>
<DataTrigger
Binding="{Binding Path=SelectionMode}"
Value="3" >
<Setter
Property="ContentTemplate"
TargetName="items"
Value="{StaticResource MultiQuantitySelection}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
里面的东西是带有一些按钮的包装纸。所以虚拟化看起来并不容易。我想要平滑滚动。问题是虽然按钮是边框和文本块,但它很慢。
我做了一个测试。
var sw = new Stopwatch();
sw.Start();
var vv = new SolidColorBrush(Colors.Red);
for (int i = 0; i < 150; i++)
{
// here is the operation that fills the control
var b = new Button();
b.Height = 65;
b.Width = 120;
b.Content = "Gamiese";
this.items.Items.Add(b);
}
this.Dispatcher.BeginInvoke(
DispatcherPriority.Loaded,
new Action(() =>
{
sw.Stop();
MessageBox.Show("Took " + sw.ElapsedMilliseconds + " ms");
}));
}
这在我的电脑上需要大约40-50毫秒,而在慢速下需要200 + ms。因此,对于所有其他的东西,而不是这个简单的例子,它可以高达600-900毫秒。因此触摸体验可能是缓慢而痛苦的。我责怪WPF,因为我用QT QML进行了类似的测试,并为更重的200个按钮创建了它,它是即时照明和平滑滚动。因此,WPF在开箱即用方面表现不佳。有什么我可以做的吗?即使缓存按钮也没有帮助。因为填充树似乎是问题。渲染不是问题,因为在所有计算机上滚动速度非常快。 自定义绘图可能会解决我的问题但我为什么要这样做?
答案 0 :(得分:1)
您的UI方案可能需要重新设计。从我从帖子中收集到的内容(不是很清楚),你试图在堆叠面板中堆叠一堆按钮。
你在慢速机器上的测试显示1.25ms /按钮,听起来非常可接受......除非你滥用系统。
更好的方法是让自己成为ListView并将您感兴趣的项目添加为项目,这样您就可以让ListView的虚拟化确定何时实例化UI元素。
您的测试表明您正在尝试堆积超过9000像素的高按钮,即使对于具有超高分辨率的超大屏幕也没有意义。