我有一个绘制指南针的 WPF 应用程序。有一个带有刻度线和标签的大环。我有一个复选框,可以打开和关闭罗盘图形。当我第一次启动应用程序时,指南针会立即打开和关闭。
同时,我有一个组合框,它从本地数据库中获取一些数据并使用它来呈现一些叠加图形。使用此组合框后,指南针图形不再快速切换。事实上,每当我单击复选框时,UI 都会完全卡住大约 4 秒。
我尝试使用 WPF 的 Window Performance Profiling Tool 来分析我的应用程序。当我激活该复选框时,不仅我的应用程序卡住了,分析器也卡住了。之后图表“ catch 了”,但这告诉我一定有严重错误。
我已经设法确定问题图形是刻度线(而不是数字标签)。如果我消除它们,卡住问题就会停止。如果我将它们从 360 减少到 36,应用程序仍然会卡住,但时间会更短。同样,无论我有多少刻度线,它们都会在应用程序首次启动时立即切换。
我的问题是,我如何弄清楚为什么我的指南针图形的切换从即时变为非常缓慢? 我已经尝试了广泛的分析和调试,但我想不出任何理由为什么在某些刻度线上设置 Visibility 会导致应用程序卡住。
编辑
好的,我已经从我的应用程序中剥离了所有东西,只剩下最基本的东西,把它压缩起来,然后上传到 Sendspace。这是链接(大约143K):
http://www.sendspace.com/file/n1u3yg
[ 注:不要不小心点击了横幅广告,真正的下载链接在页面上要小得多。]
两个请求:
最佳答案
尽管 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/