c# - 为什么从组合框进行选择后切换图形需要更长的时间?

标签 c# wpf performance mvvm profiling

我有一个绘制指南针的 WPF 应用程序。有一个带有刻度线和标签的大环。我有一个复选框,可以打开和关闭罗盘图形。当我第一次启动应用程序时,指南针会立即打开和关闭。

同时,我有一个组合框,它从本地数据库中获取一些数据并使用它来呈现一些叠加图形。使用此组合框后,指南针图形不再快速切换。事实上,每当我单击复选框时,UI 都会完全卡住大约 4 秒。

我尝试使用 WPF 的 Window Performance Profiling Tool 来分析我的应用程序。当我激活该复选框时,不仅我的应用程序卡住了,分析器也卡住了。之后图表“ catch 了”,但这告诉我一定有严重错误。

我已经设法确定问题图形是刻度线(而不是数字标签)。如果我消除它们,卡住问题就会停止。如果我将它们从 360 减少到 36,应用程序仍然会卡住,但时间会更短。同样,无论我有多少刻度线,它们都会在应用程序首次启动时立即切换。

我的问题是,我如何弄清楚为什么我的指南针图形的切换从即时变为非常缓慢? 我已经尝试了广泛的分析和调试,但我想不出任何理由为什么在某些刻度线上设置 Visibility 会导致应用程序卡住。

编辑

好的,我已经从我的应用程序中剥离了所有东西,只剩下最基本的东西,把它压缩起来,然后上传到 Sendspace。这是链接(大约143K):

http://www.sendspace.com/file/n1u3yg

[ 注:不要不小心点击了横幅广告,真正的下载链接在页面上要小得多。]

两个请求:

  • 您是否在机器上遇到问题? 尝试打开 Compass.exe(在 bin\Release 中)并快速单击复选框。指南针刻度线应无延迟地打开和关闭。然后,从组合框中选择一个项目并尝试再次快速单击该复选框。在我的机器上,它非常滞后,在我停止快速点击后,图形需要几秒钟才能 catch 。
  • 如果您确实遇到滞后,您是否在代码中看到任何可能导致这种奇怪行为的内容? 组合框没有连接任何东西,那么为什么从中选择一个项目会影响窗口上其他图形的 future 性能呢?
  • 最佳答案

    尽管 ANTS 没有指出特定的性能“热点”,但我认为您的技术有一点缺陷,因为似乎每个刻度都有一个 ViewModel它负责处理单个刻度,并且您将这些刻度单独绑定(bind)到 View 。您最终会为这些刻度创建 720 个 View 模型,每次显示或隐藏整个指南针时都会触发类似的事件。每次访问此字段时,您还会创建一个新的 LineGeometry。

    在这样的自定义绘制情况下,WPF 的推荐方法是使用 DrawingVisual并包含 WPF 渲染系统的保留模式方面。有几个 googleable 资源讨论了这种技术,但要点是声明一个从 FrameworkElement 继承的指南针类。 ,以及一些继承自 DrawingVisual 的较小类并用它来渲染指南针。使用这种技术,您仍然可以让 ViewModel 驱动指南针行为,但您不会为指南针的每个部分提供单独的 View 模型。我倾向于将指南针分解为挡板,箭头,瞄准器等部分......但您的问题可能需要不同的方法。

    class Compass : FrameworkElement
    {
        private readonly List<ICompassPart> _children = new List<ICompassPart>();
    
        public void AddVisualChild(ICompassPart currentObject)
        {
            _children.Add(currentObject);
            AddVisualChild((Visual)currentObject);
        }
    
        override protected int VisualChildrenCount { get { return _children.Count; } }
    
        override protected Visual GetVisualChild(int index)
        {
            if (index < 0 || index >= _children.Count) throw new ArgumentOutOfRangeException();
    
            return _children[index] as Visual;
        }
    
        override protected void OnRender(DrawingContext dc)
        {
            //The control automatically renders its children based on their RenderContext.
            //There's really nothing to do here.
            dc.DrawRectangle(Background, null, new Rect(RenderSize));
        }
    }
    
    class Bezel : DrawingVisual
    {
       private bool _visible;
    
       public bool Visible {
       {
         get { return _visible; }
         set
         {
            _visible = value;
            Update();
         }
       }
    
       private void Update()
       {
           var dc = this.RenderOpen().DrawingContext;
           dc.DrawLine(/*blah*/);
           dc.Close();
       }
    }
    

    关于c# - 为什么从组合框进行选择后切换图形需要更长的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10119176/

    相关文章:

    c++ - 缓存局部性能

    performance - JMeter json路径断言响应中的json或数组

    java - 用于性能分析的 Python 工具

    c# - 在WPF中使用MVVM将筛选器文本框添加到组合框

    c# - 从 HttpPostedFileBase 获取文件路径

    c# - 模拟对象数据

    c# - 将 Windows 主题更改为高对比度时,将按钮颜色更改为白色

    c# - 类似于 Watin 的 Silverlight 自动化

    .net - 单击时如何使 WPF 列表框子数据模板控件选择 ListBoxItem 容器?

    C# - 接口(interface)不能包含运算符