c# – WPF和MVVM的结构和性能
我需要创建一个简单的菜单/选择设计工具 – 我们的想法是选择一个类别和更多的选择,这些选择按选择的类别进行筛选.最终,这将在Kiosk风格的环境中运行.
我正在使用MVVM,我的设计包含一个视图,其中包含2个ItemsControls中的2个网格 – 一个用于类别(2行乘10列),另一个用于选择(10 x 10).在我的ViewModel中,这些ItemsControls都绑定到ObservableCollection对象,并且某些细节(标题,颜色等)绑定到零件的属性. DataTemplate绑定到单独程序集中的项类,因为我想在kiosk应用程序中重用它们. 我使用了“ModifiedBehaviours”类将我的网格对象的右键和左键点击映射到ViewModel选择的命令,类似于此 How can I attach two attached behaviors to one XAML element? 这个设计看起来很“干净”(我在这里看起来比较新),因为除了将ViewModel分配给窗口的DataContext,视图中没有x:name =标签之外,视图的代码隐藏在其中没有任何内容. ViewModel不会直接与视图相互影响. 但是我确实遇到了性能问题. 当用户点击一个类别时,我创建了一个包含其详细项目的新ObservableCollection – 我还在设计模式中填入空白,所以我最终得到100个选项,空的那些选项中有“右键单击编辑”. 创建此集合的时间很短 – <在1.6 Ghz上网本上0.01秒(Kiosk PC会很慢,所以我在慢速硬件上测试).然而,一旦控件绑定的集合被刷新,UI需要大约2秒来更新,这比我正在重新创建的旧应用程序要慢得多 - 这是用非常旧的Delphi编写的. 我尝试了各种各样的东西. 这些都没有做出任何改进. 以下做了 – 这导致了我的问题. >我从项目控件中删除了一个命令行为 – 我需要同时左右键单击.事实上,这必须将每个项目单元格(其中100个)的事件绑定到命令会导致问题吗? 是否有针对每个网格单元的右键和左键单击的替代方法? >< - 我的标记中有2个!我将项目的XAML(边框,文本块和命令)从单独的程序集复制到主窗口XAML中.这给了最大,最简单的改进,但我不明白为什么. 我的控件看起来像这样(在单独的程序集中).在有人指出如上所述之前,我已经尝试删除了很多,甚至将其切割成一个文本块. <Control.Resources> <Style x:Key="MyBorderStyle" TargetType="Border"> <Style.Triggers> <DataTrigger Binding="{Binding IsSelected}" Value="True"> <Setter Property="BorderBrush" Value="Red"/> <Setter Property="BorderThickness" Value="3"/> </DataTrigger> <DataTrigger Binding="{Binding IsSelected}" Value="False"> <Setter Property="BorderBrush" Value="{Binding BackColour}"/> <Setter Property="BorderThickness" Value="0"/> </DataTrigger> </Style.Triggers> </Style> </Control.Resources> <Grid> <Border Margin="1" Style="{StaticResource MyBorderStyle}" CornerRadius="8"> <CommandBehaviour:CommandBehaviorCollection.Behaviors> <CommandBehaviour:BehaviorBinding Event="MouseLeftButtonDown" Command="{Binding DataContext.SelectLeftCommand,RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type Window}}}" CommandParameter="{Binding ItemKey}"/> <CommandBehaviour:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding DataContext.SelectRightCommand,AncestorType={x:Type Window}}}" CommandParameter="{Binding ItemKey}"/> </CommandBehaviour:CommandBehaviorCollection.Behaviors> <Border.Background> <LinearGradientBrush StartPoint="0.7,0" EndPoint="0.7,1"> <GradientStop Color="{Binding BackColour}" Offset="0"/> <GradientStop Color="#33333333" Offset="1.5"/> </LinearGradientBrush> </Border.Background> <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="{Binding ForeColour}" Text="{Binding Description}"/> </Border> </Grid> 当我将它复制到主窗口中的ItemsTemplate并且性能提升时,我可以留下很多这样的东西. 声明-咆哮 这真的是裤子. 呼吸…… 解决方法
如果它只是一个刷新,那么你不应该创建一个新的ObservableCollection,而只是添加/删除项目;分配新的ObservableCollection将导致WPF引擎清除旧UI并再次呈现整个UI,这将非常耗时. 同时检查绑定错误,因为它们的性能也是如此,在调试模式下查看Visual Studio中的输出窗口,您将获得绑定错误的详细信息.使用RelativeSource绑定会发生很多事情,并且在您的情况下也可能成为瓶颈. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |