WPF快速控制/无论创建

时间:2013-03-06 13:28:43

标签: wpf performance

我有一个 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在开箱即用方面表现不佳。有什么我可以做的吗?即使缓存按钮也没有帮助。因为填充树似乎是问题。渲染不是问题,因为在所有计算机上滚动速度非常快。 自定义绘图可能会解决我的问题但我为什么要这样做?

1 个答案:

答案 0 :(得分:1)

您的UI方案可能需要重新设计。从我从帖子中收集到的内容(不是很清楚),你试图在堆叠面板中堆叠一堆按钮。

你在慢速机器上的测试显示1.25ms /按钮,听起来非常可接受......除非你滥用系统。

更好的方法是让自己成为ListView并将您感兴趣的项目添加为项目,这样您就可以让ListView的虚拟化确定何时实例化UI元素。

您的测试表明您正在尝试堆积超过9000像素的高按钮,即使对于具有超高分辨率的超大屏幕也没有意义。